gpt4 book ai didi

c - 根据需要扩展动态内存块

转载 作者:行者123 更新时间:2023-11-30 14:51:02 25 4
gpt4 key购买 nike

我想将数据分配给一 block 内存,但我不知道我需要的大小是多少。
例如,下面只是一个简单的例子来说明目的:

char *str = (char*)malloc(2);
for (int i = 1; i < 10; i++) {
str[i] = i;
realloc(str, strlen(str) + 1);
}
printf("%s\n", str);

前面的代码打印未知符号,如下所示:

那么问题出在哪里?

最佳答案

您正在分配内存,没关系。你正在里面写一个字符限制,那也没关系。但如果你使用 strlen,那就不行了,因为strlen 需要一个有效的字符串,但您没有传递字符串。

在 C 中,字符串只是以字符结尾的字符序列'\0'-终止字节。你没有这样做,所以 strlen 将超出限制直到找到 '\0' 终止字节,并且这是未定义的行为。

此外,realloc可能在扩展内存时会更改内存位置。你没有考虑到这一点。如果realloc返回不同的指针,则旧的指针位置无效,下一个 realloc 调用将产生未定义的行为。

您填充数据的方式,您甚至不需要 strlen 调用,i已经为您提供了该信息。

要修复您的代码:

char *str = calloc(2, 1);
if(str == NULL)
{
// error handling
// do not continue
return;
}

for (int i = 0; i < 9; i++) {
str[i] = i + 1 + '0';
str[i+1] = 0; // making sure you have a valid c-string

char *tmp = realloc(str, strlen(str) + 2);
if(tmp == NULL)
{
// error handling,
// do not continue
free(str);
return;
}

// making sure that str points to the new location
// if realloc returned a different pointer
str = tmp;
}

printf("%s\n", str);
free(str);

您应该始终检查malloccallocrealloc的返回值。另外,realloc 应该是 strlen(str) + 2+2 因为您要添加一个新字符,并且必须为 '\0' 终止字节留出空间。

请注意,对于第一次分配,我使用了 calloc,因为 calloc 还设置了分配的内存为0,非常适合初始化。但不管怎样,你每次添加新字符时都应设置 '\0' 终止字节(str[i+1] = 0; 行)。我还存储了值 i + '0',这很可能是你想要什么。 1 != '1',因为字符 '1' 的值为 49,而不是 1。请参阅:ASCII table .

我已将 str[i] = i + '0'; 更改为 str[i] = i + 1 + '0';,因为它似乎您希望字符串以 '1' 开头,而不是 '0'

永远不要忘记释放您分配的内存。你可以释放内存在程序结束时或者更好的是当您不再需要它时。

关于c - 根据需要扩展动态内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614879/

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