我写了一个练习指针和分配内存的问题。
然而,当我释放内存时,我正在获得堆栈转储。我在正确的地方解放了吗?我的程序还有什么问题导致它不安全吗?
void display_names(char **names_to_display, char **output);
int main(void)
{
char *names[] = {"Luke", "John", "Peter", 0};
char **my_names = names;
char *new_output[1024] = {0};
size_t i = 0;
// Print the ordinal names
while(*my_names)
{
printf("Name: %s\n", *my_names++);
}
my_names = names; /* Reset */
display_names(my_names, new_output);
// Print the updated names
while(new_output[i])
{
printf("Full names: %s\n", new_output[i]);
i++;
}
// Free allocated memory
free(new_output);
getchar();
return 0;
}
void display_names(char **names_to_display, char **output)
{
while(*names_to_display)
{
*output = (char*) malloc(strlen("FullName: ") + strlen(*names_to_display) + 1);
if(!*output)
{
fprintf(stderr, "Cannot allocate memory");
exit(1);
}
// Copy new output
sprintf(*output, "FullName: %s", *names_to_display++);
printf("display_names(): Name: %s\n", *output++);
}
}
答案 0 :(得分:12)
您没有为new_output分配内存,它是由编译器分配的。 free是在运行时malloc内存时使用,而不是在编译时释放编译器分配的内存。
你的new_output是一个局部变量,当它超出范围时会被释放,即在声明它的函数的右括号中。
答案 1 :(得分:7)
你的问题是当你说:
free(new_output);
new_output
是堆栈中的数组。它没有用malloc()分配,所以你不能用free()释放它。您需要释放new_output
包含的指针。
答案 2 :(得分:7)
char * new_display [1024]的声明意味着您声明了一个包含1024个元素的数组,每个元素都是一个指向char的指针。 数组本身在这里静态分配,将在堆栈上保留1024个元素的数组。 在您的示例中,您通过使用malloc分配内存并设置数组的每个元素来填充此数组的条目,这是您应该释放的内存,而不是静态分配的数组本身。
因此,您不需要调用free(new_display),而是需要遍历数组条目并执行free(new_display [i]),这样您就可以释放 分配的内容。< / p>