strlen和sizeof的区别

Martin Morning 2019-07-10 11:41:38

为啥第一种和第二种不同呢?
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gouyanfen 2019-07-10
  • 打赏
  • 举报
回复
引用 4 楼 Martin Morning 的回复:
[quote=引用 3 楼 636f6c696e的回复:]同意,代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度 你的第一个例子,strlen就是内存越界,结果是未定义值
可是我在第一个例子中无论定义多少个字符,l 的结果总是字符个数加1。如果说代码错误,那么到底存在哪呢,能不能具体解释一下[/quote] 因为你的第一个字符数组用strlen的最后大小取决于,这块内存到什么地方有0,你是结果总是字符数加一,是因为首先字符是固定的,那后面内存中什么时候有0呢,你的字符数组分配在栈中,一般来讲,后面的变量分配会占用。具体什么原因,你把字符数组的内存地址打印出来,直接看栈的内容。
Martin Morning 2019-07-10
  • 打赏
  • 举报
回复
引用 3 楼 636f6c696e的回复:
同意,代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度 你的第一个例子,strlen就是内存越界,结果是未定义值
可是我在第一个例子中无论定义多少个字符,l 的结果总是字符个数加1。如果说代码错误,那么到底存在哪呢,能不能具体解释一下
636f6c696e 2019-07-10
  • 打赏
  • 举报
回复
同意,代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度 你的第一个例子,strlen就是内存越界,结果是未定义值
Martin Morning 2019-07-10
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678的回复:
代码错 分析结果毫无意义 至于strlen 和 sizeof 请直接百度
第一种赋值方法错了吗,为什么不能这么用
lin5161678 2019-07-10
  • 打赏
  • 举报
回复
代码错 分析结果毫无意义 至于strlen 和 sizeof 请直接百度
636f6c696e 2019-07-10
  • 打赏
  • 举报
回复
不同环境不同编译器实现不一致,我这边的环境不同字符数结果是不一样的 所以叫做未定义行为
引用 4 楼 Martin Morning 的回复:
[quote=引用 3 楼 636f6c696e的回复:]同意,代码本身就是错的 字符串必须末尾有\0 并不是所有char数组都是字符串 只有字符串才能用strlen获取长度 你的第一个例子,strlen就是内存越界,结果是未定义值
可是我在第一个例子中无论定义多少个字符,l 的结果总是字符个数加1。如果说代码错误,那么到底存在哪呢,能不能具体解释一下[/quote]
Intel0011 2019-07-10
  • 打赏
  • 举报
回复
char b[] ="abcde"; 等价于 char b[] = { 'a', 'b', 'c', 'd', 'e', '\0' }; // 字符串是有结束符的
char a[] = { 'a', 'b', 'c', 'd', 'e'}; 等价于 char a[5] = { 'a', 'b', 'c', 'd', 'e'}; --> 注意此时后面没有结束符,strlen(a)的结果取决于a后面的'\0'的位置,但这已经是越界了,结果是错误的

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧