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

时间:2015-06-07 06:46:44

标签: 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;
}

2 个答案:

答案 0 :(得分:3)

result在堆栈上定义,并且在romanizer执行完毕后从堆栈中释放出来。#34;#&lt; 34;}因此,当您main尝试使用它时,会出现分段错误。

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

答案 1 :(得分:1)

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

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