gpt4 book ai didi

c - 释放调用者中由被调用者重新分配的内存?

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

这是我的情况:

main根据字符串分配内存,并通过传递地址来调用函数。然后,该函数适本地调整传递的内存大小以容纳更多数据。之后,当我尝试释放内存时,出现堆错误。

这是代码:

typedef char * string;
typedef string * stringRef;

/**************************
main
**************************/
int main()
{
string input = "Mary had";

string decoded_output = (string)calloc(strlen(input), sizeof(char));
sprintf(decoded_output, "%s", input);
gen_binary_string(input, &decoded_output);
free(decoded_output); /*this causes issue*/

return 0;
}

void gen_binary_string(string input,stringRef output)
{
int i=0, t=0;
size_t max_chars = strlen(input);

/*
the array has to hold total_chars * 8bits/char.
e.g. if input is Mary => array size 4*8=32 + 1 (+1 for \0)
*/
string binary_string = (string)calloc((BINARY_MAX*max_chars) + 1, sizeof(char));

int offset = 0;

/* for each character in input string */
while (*(input+i))
{
/* do some binary stuff... */
}

/* null terminator */
binary_string[BINARY_MAX*max_chars] = '\0';

int newLen = strlen(binary_string);
string new_output = (string) realloc((*output), newLen);
if (new_output == NULL)
{
printf("FATAL: error in realloc!\n");
free(binary_string);
return;
}
strcpy(new_output, binary_string);

(*output) = new_output;

free(binary_string);
}

最佳答案

您可能误解了realloc的用途。调用realloc不一定会返回新分配的对象。如果可能,它将返回相同的对象,扩展以容纳更多字节。此外,它还会自动复制对象的内容。 Theferore:(1)你不应该复制,(2)你不应该释放旧的缓冲区。

The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes... (snip) Unless ptr is NULL, it must have been returned by an earlier call to malloc(), calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.

<小时/>

更好地阅读您的代码后,我不明白您为什么在这里使用 realloc ,因为您没有使用 output 的旧内容>。如果将 realloc 替换为 malloc,您会得到相同的行为(以及相同的错误)。我认为你真正的问题是你没有分配足够的字节:你应该有 strlen(binary_string) + 1 来容纳 '\0' 末尾的字符串。

关于c - 释放调用者中由被调用者重新分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794205/

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