c - 从函数返回 char** 时出现段错误

标签 c string

我有一个函数,它查找传入数组的罗马数字并将它们存储在字符串数组中,然后将字符串数组返回给 main()。但是当我尝试访问 main() 中返回的字符串数组时,代码由于段错误而失败。有人可以向我解释为什么会这样吗?我该如何更正我的代码?

在出现段错误和正常工作的代码中添加注释。非常感谢您的时间和帮助。

int find_lookup_index(int temp)
{

    int j=0;
    while(1)
        {
            if(temp>=lookup_int[j] && temp<lookup_int[j+1])
                break;
            j++;
        }
    return j;
}

char** romanizer(int num_size, int* num)
{

    int i,j,temp;
    char result[num_size][20];


    for(i=0;i<num_size;i++)
    {
        strcpy(result[i],"\0");

        if(num[i]%1000 == 0)
        {
            strcpy(result[i],"M");
            continue;
        }

        j=find_lookup_index(num[i]);

        temp=num[i];
        while(temp>0)
        {
            strcpy(result[i],strcat(result[i],lookup_char[j]) );
            temp = temp - lookup_int[j];
            j = find_lookup_index(temp);
        }        

    }

    **/* WORKS CORRECTLY HERE */**
    for(i=0;i<num_size;i++)
        printf("%s\n",result[i]);
    return (char **)result;
}

int main() 
{

    int size,i;
    char **result;

    int arr[3] = {3,11,499};
    result = romanizer(3,arr);

    **/* NOT WORKING - SEGMENTATION FAULT - WHY ? */**
    for(i=0;i<3;i++)
        printf("%s\n",result[i]);

    return 0;
}

最佳答案

result 在堆栈上定义,当 romanizer 执行完毕时,它会从堆栈中“释放”出来。因此,当您的 main 尝试使用它时,它会出现段错误。

解决方案是malloc 数据结构(将其分配在堆上而不是堆栈上),并在不再需要时让调用者释放

关于c - 从函数返回 char** 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690862/

相关文章:

c - 嵌套结构中的灵活数组成员

c - 有没有 libgpod 的 Linux 替代品来读取/写入 iPod 数据库?

java - 字符串的 HashSet 和仅检索每个元素的第一个单词

java - 如何在 Java 中将子字符串与普通空格进行比较

python - 在一列字符串中搜索多个子串并返回子串类别

c - 左值转换时,为什么 & 和 | 如此特殊?从未提及?

c - 在 C 中执行时显示完成百分比

c++ - Windows Mobile 中的_CrtDbgReport 输出在哪里?

JavaScript include() 并忽略空白,修复代码格式

Javascript 从某个位置查找第一个非字母字符的索引