gpt4 book ai didi

c - 字符数组的未定义长度

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:30 26 4
gpt4 key购买 nike

我一直在想有什么区别

    char[] = "hello world"

    char[20] = "hello world"

我试着写了这段简短的代码:


#include <stdio.h>
#include <stdlib.h>


int main(){
int i;
char str[20] = "hello world";
for( i = 0; i<20; i++){
if(str[i]=='\n')
printf("\nExit character newline");
else if(str[i]=='\0')
printf("\nNull terminated..");
else
printf("\nCur: %c", str[i]);
}
return 0;

}

哪些输出:


Cur: h
Cur: e
Cur: l
Cur: l
Cur: o
Cur:
Cur: w
Cur: o
Cur: r
Cur: l
Cur: d
Null terminated..
Null terminated..
Null terminated..
Null terminated..
Null terminated..
Null terminated..
Null terminated..
Null terminated..
Null terminated..

另一方面,当我没有具体定义数组大小而只是使用

    char[] = "hello world"

它给了我这个输出:

Cur: h
Cur: e
Cur: l
Cur: l
Cur: o
Cur:
Cur: w
Cur: o
Cur: r
Cur: l
Cur: d
Null terminated..
Cur:
Null terminated..
Null terminated..
Null terminated..
Cur:
Cur:  
Cur: a
Null terminated..

我对上面的输出感到困惑。 char[] = "hello world"不会以 12 个元素结束,最后一个元素中填充了空终止符吗?另外,如果我用 %s 打印 char,我的假设是否正确?

最佳答案

声明 `char str[] = "hello world"为 12 个字符保留空间,最后一个为零。不像其他一些语言。然而,C 实现通常不努力捕获越界数组访问。通常,尝试读取超出字符串末尾的内容将访问恰好跟在它们后面的任何存储内容,但除非使用一种允许控制对象放置的实现(例如,通过在翻译单元中只有一个对象,并且使用链接器规范强制将该翻译单元的数据放置在另一个翻译单元之前),读取超过字符串末尾不会产生可预测的后果。如果一个人正在使用一个积极的优化编译器,它可能会决定它可以省略任何代码,这些代码只有在程序试图访问数组末尾以外的数据时才相关。

关于c - 字符数组的未定义长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com