gpt4 book ai didi

对 C 字符串感到困惑

转载 作者:行者123 更新时间:2023-11-30 21:28:44 25 4
gpt4 key购买 nike

在学习 C String 时,我有这样的代码片段:`

char s[1];
strcpy(s, "hello");
puts(s);
printf("sizeof(s) = %ld\n", sizeof(s));//the result is 1
printf("strlen(s) = %ld\n", strlen(s));//the result is 5
printf("s[4] = %c\n", s[4]);//print 'o'

为什么这段代码会产生这种奇怪的结果?我的意思是我可以合法地将长度为 5 的字符串分配给声明为大小 1 的字符串。

最佳答案

I mean I can legally assign the string of length 5 to a string declared with size 1.

不,你不能。您已经写入了缓冲区末尾,这会调用未定义的行为。代码是错误的,但语言标准没有要求编译器以任何特定方式处理这种情况。结果可能是任何结果,从立即崩溃到乱码输出,再到完全按预期工作。这完全取决于内存中 s 后面的内容。

C 对数组访问不进行边界检查;该语言假设您足够聪明,不会访问数组边界之外的元素。如果您读取或写入超过数组末尾,它不会引发异常。只要您不破坏任何重要的内容,您的代码就会正常运行。

关于对 C 字符串感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427420/

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