关于C语言中空操作(空字节)的定义、适用范围及数组终止判定的疑问
关于C语言中空操作(空字节)的定义、适用范围及数组终止判定的疑问
嘿,刚入门C语言有这种疑问太正常啦,完全不用不好意思~我来给你把这事儿掰扯明白:
首先得搞清楚:你说的“空字节”(也就是值为0的\0字符),它是C风格字符串专属的结束标记,和普通的数值数组一毛钱关系都没有!
比如你定义个字符串char str[] = "hi";,它在内存里实际是h i \0存着的——这个\0就是给printf("%s")、strlen()这类字符串函数用的,告诉它们“到这儿就该停了,后面不是字符串内容了”。
那回到你的代码问题:你写的是int类型的数组,这和字符串完全是两码事:
- 普通的数值数组(不管是
int、float还是啥),C语言根本不会自动给它加什么空字节或者终止标记。 - 你的循环现在其实有问题!你用了
sizeof(numb_array)当循环上限——sizeof返回的是整个数组的字节数,不是元素个数!比如如果你的系统里int占4个字节,那sizeof(numb_array)就是8,你的循环会跑8次,后面6次都是在访问数组外面的内存,这属于越界访问,是C里的“未定义行为”,运气好输出乱码,运气差程序直接崩溃。 - 正确的做法是用
sizeof(numb_array) / sizeof(numb_array[0])来计算元素个数——这个式子不管int占多少字节,都能算出准确的元素数量(这里是2),循环就只会跑2次,刚好遍历完数组里的所有元素。
最后再明确一下你核心疑问的答案:
- 空字节只服务于C风格字符串,数值数组根本没这东西
- 编译器根本不需要“知道数组什么时候停”,是你写的循环条件控制着遍历的范围——只要你用正确的元素个数当终止条件,就不会出问题
- 你的代码现在的问题是循环条件写错了,赶紧改成用元素个数来控制哦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

