我以为我了解动态内存的基本工作原理,但我做了以下操作。我使用这个函数来分配动态内存:
int get_alota_mem(char*** const ptr)
{
int result = EXIT_SUCCESS;
bool success = true;
if (success && (*ptr = calloc(10, sizeof **ptr)) == NULL)
{
result = EXIT_FAILURE;
success = false;
}
for (int i = 0; i < 10; i++)
{
if (success && ((*ptr)[i] = calloc(20, sizeof ***ptr)) == NULL)
{
result = EXIT_FAILURE;
success = false;
}
}
return result;
}
我使用这个函数来释放分配的动态内存:
void free_alota_mem(char** const ptr)
{
for (int i = 0; i < 10; i++)
{
free(ptr[i]); // segfault!
ptr[i] = NULL;
}
free(ptr);
}
在这两个调用之间,我可以使用内存并且不会遇到任何段错误。但是当我尝试释放内存时,我遇到了一个段错误,其中包含我尝试释放的第一个值。
我知道我可以只做 char* ptr[10]
并且只使用自动分配的数组而不是动态分配的指针,这会省去一些麻烦,但我想尝试做这项工作。
编辑: 我的主要:
int main(void)
{
char** mem = NULL;
get_alota_mem(&mem);
mem[0] = "Hello";
mem[1] = "world";
free_alota_mem(mem);
}
最佳答案
您试图释放字符串文字。将不是 NULL
的指针传递给 free()
将调用 未定义的行为。
要复制字符串,请使用 strcpy()
函数。
#include <string.h>
int main(void)
{
char** mem = NULL;
get_alota_mem(&mem);
strcpy(mem[0], "Hello");
strcpy(mem[1], "world");
free_alota_mem(mem);
}
关于c - 正在释放的指针未分配/段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37042047/