gpt4 book ai didi

c - 只是好奇,为什么这不会导致段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:02 27 4
gpt4 key购买 nike

所以我的理解是,例如“0123456789”的 C 字符串实际上会占用 11 个字符的数组,10 个字符用于正文,一个用于终止空值。如果这是真的那么为什么下面的代码不会导致某种错误?

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

int main(int argc, char ** argv){

char * my_string = "0123456789";
/* my string should occupy 11 bytes */

int my_len = strlen(my_string);
/* however, strlen should only return 10,
because it does not count the null byte */

char * new_string = malloc(my_len);
/* allocate memory 10 bytes wide */

memcpy(new_string, my_string, my_len);
/* copy the first 10 bytes from my_string to new_string
new_string should NOT be null terminated if my understanding
is correct? */

printf("%s\n", new_string);

/* Since new_stirng is NOT null terminated it seems like this should
cause some sort of memory exception.
WHY DOES THIS NOT CAUSE AN ERROR?

*/

return 0;
}

因为 new_string 不是 null 终止的,我希望 printf 永远读取直到它到达其他应用程序内存,或者随机放置在某处的 0x00 并崩溃或打印奇怪的东西。怎么回事?

最佳答案

您已经创建了undefined behavior .该行为取决于编译器和平台。它可能会崩溃。它可以工作。它可以让你 toast 。它可能会使您的计算机坍缩成奇点并吸收太阳系。

在你的情况下,很可能 new_string[11] 处的内存已经是 0,即 '\0',或者终止空字符。

关于c - 只是好奇,为什么这不会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857105/

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