【问题标题】:Segmentation fault on returning char** from a function从函数返回 char** 时出现分段错误
【发布时间】:2015-06-07 06:46:43
【问题描述】:

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

在代码中添加了 cmets,其中可以看到分段错误并且可以正常工作。非常感谢您的时间和帮助。

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;
}

【问题讨论】:

  • 您不仅返回本地自动 var 按地址,而且无论如何它都不是您要转换的类型。 char[n][m] 确实not 表示为char**,并且如果没有硬转换它就不会编译应该是一个提示。不妨同时解决这两个问题。

标签: c string


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在您的 romanizer 函数中,您在堆栈上分配结果,从您的函数返回时会自动为您释放。当您尝试在 main 中使用它时,它已经消失了。

    您必须使用 new/Malloc 在堆上分配它,然后在 main 中删除/释放它,或者在 main 中分配它并将其作为参数而不是返回值传递。

    【讨论】:

    • 太棒了! ?。很高兴我的回答很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多