gpt4 book ai didi

c - realloc 分配的内存比请求的多

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

我对以下功能有疑问。

当我尝试realloc() 内存时,我得到的内存比实际要求的多!

在这种情况下,我尝试连接 2 个字符串,一个长 14 个字符,一个长 11 个字符,但最终结果是 memTemp 是 38 个字符长,即使 memNewSize 显示实际上是25,有谁知道怎么办吗?

int dstring_concatenate(DString* destination, DString source)
{
assert(destination != NULL); // Precondition: destination ar ej NULL
assert(*destination != NULL); // Precondition: *destination ar ej NULL
assert(source != NULL); // Precondition: source ar ej NULL
//Dstring looks like this = "typedef char* Dstring;"

int memNewSize = strlen(*destination) + strlen(source);
char *memTemp;
memTemp = (char*)realloc(memTemp, sizeof(char) * memNewSize);

printf("%d\n", memNewSize);
printf("%d\n", strlen(memTemp));

if(memTemp == NULL)
{
printf("Could not allocate new memory.\n");
return 0;
}
else
{
*destination = memTemp;
strcat(*destination, source);
return 1;
}
}

最佳答案

这里的问题是,realloc() 仅在(正确)

  • 分配器函数先前返回的指针
  • NULL 指针。

引用 C11,章节 §7.22.3.5

If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined. [....]

在您的情况下,memTemp(作为一个自动存储的局部范围变量)只是一个未初始化的指针,具有一个不确定的值,指向谁知道是什么地址!它甚至不能保证为 NULL。所以,你只有 undefined behavior .

只是一个猜测:您可能打算用传入的 *destination 初始化 memTemp


也就是说,正如在实际问题下的评论中指出的那样,

  • realloc() 中提供的大小乘数应该是 memNewSize + 1 以便能够容纳空终止符。
  • sizeof(char) 在 C 中保证为 1,因此将其用作乘数是多余的。

关于c - realloc 分配的内存比请求的多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47173726/

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