gpt4 book ai didi

c - 正在释放的指针未分配/段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:02 25 4
gpt4 key购买 nike

我以为我了解动态内存的基本工作原理,但我做了以下操作。我使用这个函数来分配动态内存:

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/

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