C语言数组:不是说char[]="hello"共6位最后一位为\0,char[4]="hell";那么最后一个一位/0去哪里?
4个回答
展开全部
上面的回答已经说明了本质,这是一个数组越界,是错误的代码编写方式,千万不要这么写。
什么是数组越界,就是char[4]明确只能存4个字符,但是char[4]="hell"却给他赋值了5个字符:'h'、'e'、'l'、'l'、'o'、'\0'。
上面的这个'\0'虽然你手动并没有写,但实际上编译器会给你加,是隐性的。
所以char[]="hello"的strlen和sizeof不同,前者是5后者是6就因为多了一个'\0'。而且为什么char[]="hello"没有越界,因为char[]并没有指定数组长度,他是变长的。
最后补充一点char[4]="hell"是数组越界,是一个错误的字符串使用方式,一些编译器在编译时严格上会报告警或错误。但如果char[4]不作为字符串使用而作为字符数组来存单个字符的话可以这个用:char[4]={'h', 'e', 'l', 'l'},这样编译应该不会错,但也只能作为字符数组用不能作为字符串使用,比如printf("%s"),这种就不行,即使能输出也是碰运气,因为%s的时候是遇到\0截至,而你不知道后面的内存是不是干净的,除非你改成char[5]={'h', 'e', 'l', 'l', '\0'},这种估计可以当字符串使用,但基本不会有人这么用。
什么是数组越界,就是char[4]明确只能存4个字符,但是char[4]="hell"却给他赋值了5个字符:'h'、'e'、'l'、'l'、'o'、'\0'。
上面的这个'\0'虽然你手动并没有写,但实际上编译器会给你加,是隐性的。
所以char[]="hello"的strlen和sizeof不同,前者是5后者是6就因为多了一个'\0'。而且为什么char[]="hello"没有越界,因为char[]并没有指定数组长度,他是变长的。
最后补充一点char[4]="hell"是数组越界,是一个错误的字符串使用方式,一些编译器在编译时严格上会报告警或错误。但如果char[4]不作为字符串使用而作为字符数组来存单个字符的话可以这个用:char[4]={'h', 'e', 'l', 'l'},这样编译应该不会错,但也只能作为字符数组用不能作为字符串使用,比如printf("%s"),这种就不行,即使能输出也是碰运气,因为%s的时候是遇到\0截至,而你不知道后面的内存是不是干净的,除非你改成char[5]={'h', 'e', 'l', 'l', '\0'},这种估计可以当字符串使用,但基本不会有人这么用。
展开全部
char c[4]="hell";这种情况属于数组越界,是逻辑错误。并且这个字符\0仍然有,只不过非法修改了内存中的其它内容。
更多追问追答
追问
请问如果是您所说的追加的话我可以理解为由于非法修改导致数组的实际为5只是显示为4。是这样吗?
追答
实际分配的空间仅有4个字符,但运行时初始化的内容是5个字符,非法占用了一个。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char a[4]="hell"这种本来就有问题 a只有4字节空间 却写了5个字节进去 内存越界了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char是关键字。用户标识一般用来给变量数组函数等命名。用户标识符与关键字相同,编译时系统给出错误信息
追问
不好意思打错了char a[]="hello".char b[4]="hell"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询