c - 为什么在从其他函数释放字符串数组时出现段错误?

标签 c

这是我的代码。如果我对这段代码有误,请告诉我。 代码:

char **arrofstr(void)
{
    char **ret = malloc(sizeof(*ret)*3);

    ret[0] = strdup("idx0");
    ret[1] = strdup("idx1");
    ret[2] = '\0';

    return ret;
}

void freearr(char ***ptr)
{
    int i=0;

    while(*ptr[i] != '\0')
    {
        free(*ptr[i]);
        printf("free(ptr[%d])\n", i);
        i++;
    }
    free(*ptr);
}

int main(void)
{
    char **arr = arrofstr();
    int i=0;

    while(arr[i] != '\0')
    {
        printf("%s\n");
        i++;
    {

    freearr(&arr);

    return 0;
}

这是我编译后终端的输出 输出:

$ ./arrofstr
idx0
idx1
free(ptr[0])
segmentation fault

我不知道这段代码有什么问题,我使用的是gcc 3.1.0。

最佳答案

free(*ptr[i]);

* 运算符 get 在 [i] 运算符之后执行,参见 operator precedence .所以代码首先跳转 i * sizeof(*ptr) 字节,然后取消引用。你想要:

free((*ptr)[i]);

同时打开编译警告 -Wall 并且不要将整数值 '\0'(等于 0x00)分配给指针。为此使用 NULL

@编辑 所以,试试这个:

#include <stdio.h>
char **arrofstr(void)
{
    char **ret = malloc(sizeof(*ret)*3);

    ret[0] = strdup("idx0");
    ret[1] = strdup("idx1");
    ret[2] = NULL;

    return ret;
}

void freearr(char ***ptr)
{
    int i=0;

    while((*ptr)[i] != NULL)
    {
        free((*ptr)[i]);
        printf("free(ptr[%d])\n", i);
        i++;
    }
    free(*ptr);
}

int main(void)
{
    char **arr = arrofstr();
    int i=0;

    while(arr[i] != NULL)
    {
        printf("%s\n", arr[i]);
        i++;
    }
    freearr(&arr);   
    return 0;
}

关于c - 为什么在从其他函数释放字符串数组时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52677882/

相关文章:

c - 搜索/删除时出现 2-3 棵树分割错误

c - 我在处理字符串时遇到段错误?

c - 从 STDIN 读取,除非它是空的

c - 如何开始用 C 语言构建编程语言?

c - X509_STORE_add_lookup() 中的段错误

c++ - 如何在链接存档文件时将库版本信息添加到 elf 文件,并且所有存档文件都有其版本信息?

c - 如何以更优化的方式提取位?

c - 使用 C 返回数组

c - 如何在结果中找到最大数量

c - fork:子进程不会停留在无限循环中