gpt4 book ai didi

c - 意外的整数变化(内存溢出)

转载 作者:行者123 更新时间:2023-11-30 18:46:56 25 4
gpt4 key购买 nike

我试图在 for 循环中连接 C 中的两个字符串,但遇到了一个问题:我的整数 (i) 在读取一次后突然变成了看似随机的数字。

char string[] = "Example String";
char result[] = "";
for (int i = 0; i < 10; i++) {
printf("%d\n", i); //i prints 0 on the first loop and a random
//number the next, which terminates the program.
strcat(result, string);
printf("%s\n", result);
}

最佳答案

问题在于您正在初始化一个长度为 1 的字符串,包括 null 终止符。

char result[] = "";

因此,当您尝试将 string 写入 result 时,并且该字符串比 result 长(很可能是这样,因为 sizeof result 是1),你溢出了它,这是一种未定义的行为:

strcat(result /* length of 1*/ , string /* length of 15*/);

如果将 i 中存储的随机数转换为十六进制,并使用其 ASCII 值,您可能会看到正在编写的字符串的一部分。这是因为,如果你的字符串足够长,就会导致......堆栈溢出。 (ba dum chshhhhhh)

因此其他随机内存会被您的字符串覆盖,包括存储 i 的内存。

解决方案:将 result 变量分配为具有足够内存的指针,以存储需要放入其中的字符串。在这种情况下:

char string[] = "Example String";
char * result = malloc(sizeof (char*) + (sizeof string * 10)); // 10 being the number of iterations in the for loop

请记住,如果您需要更改分配的内存量,您还可以使用 result = realloc(result, sizeof(char *) + previousResultSize + concatStringLength); 之类的内容。只是不要忘记字符串的空终止符!

关于c - 意外的整数变化(内存溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49927288/

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