我有一个函数可以找到数组中传递的罗马数字,并将它们存储在字符串数组中,并将字符串数组返回给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;
}
答案 0 :(得分:3)
result
在堆栈上定义,并且在romanizer
执行完毕后从堆栈中释放出来。#34;#&lt; 34;}因此,当您main
尝试使用它时,会出现分段错误。
解决方案是malloc
数据结构(在堆上而不是堆栈上分配它),并在不再需要时让调用者free
。
答案 1 :(得分:1)
在您的romanizer函数中,您将在堆栈上分配结果,该函数会在您从函数返回时自动释放。当你尝试在main中使用它时它已经消失了。
您必须使用new / Malloc在堆上分配它,然后在main中删除/释放它,或者在main中分配它并将其作为参数而不是返回值传递。