C语言数组终止规则疑问:字符串与整型数组的结尾问题
关于字符串char数组的疑问
你写的char word[5] = "Stack";里,数组大小5表示这个数组一共有5个元素,索引范围是word[0]到word[4],刚好把"Stack"的5个字符存进去。这里要注意:字符串字面量"Stack"本身在内存里是带一个'\0'结束符的,但当你指定数组大小为5时,编译器只会复制前5个字符到数组里,不会把'\0'加进去。所以这个数组不是合法的C字符串——如果用strlen、printf("%s")这类字符串函数操作它,会因为找不到结束符而出错。
关于整型数组的疑问
1. 数组大小、越界访问与NULL的问题
int odds[5] = {1, 3, 5, 7, 9};里的5同样表示数组有5个元素,索引是odds[0]到odds[4],根本不存在odds[5]这个元素。你打印odds[5]和odds[6]得到0,是因为访问了数组之外的内存空间,这属于未定义行为——这个值是随机的内存垃圾值,刚好这次是0而已,换个环境或者程序可能就变成其他数了。
另外,NULL是指针类型的常量,对整型数组来说没有任何意义,整型数组也不存在“以NULL结尾”的说法,C语言不会给整型数组自动加任何结束标记。
2. 数组是否都以0结尾?
没有这种通用规则。只有当char数组被用作C字符串时,才需要以'\0'(值为0的字符)作为结束标记,这样字符串函数才能识别它的边界。但如果只是普通的char数组(比如用来存字节数据,不是字符串),也不需要加'\0'。其他类型的数组(int、float等)完全不需要以0结尾,也不会自动补0——除非你初始化时给出的元素个数少于数组大小,比如int arr[5] = {1,2};,这时剩下的arr[2]、arr[3]、arr[4]会被自动初始化为0,但这是初始化规则,和“结束符”无关。
内容的提问来源于stack exchange,提问作者user17471187

