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

标签 c pointers memory memory-management

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

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/

相关文章:

c - libcurl 回调函数,使用简单的接口(interface)

c++ - 为什么数组中的指针不存储在连续的内存中

c - 在先前 malloc ed 指针上使用 realloc 会导致段错误

c - 我如何制作一个 25 位宽的无符号整数和一个 bool 位?

c - 分配动态二维字符数组

c - 为什么使用 libgcc.a 中的 sqrtf 函数会导致链接 double 函数?

c++ - Qt QList<T> 转换和 node_copy

c - 以相反的顺序读取文件行(结构、成员、malloc)

c++ - 我们可以记录给cpu的指令吗?

c - printw() 不会打印 uint8_t 数组中的单个字符