我有一个levenshtein
方法,它填充一个包含信息的struct
的二维数组,并返回指向该数组的指针。当我将它发送到另一个方法时,我在运行时收到一个 Segmentation Fault (core dumped)
错误。请帮我解决这个明显的错误。
struct chartEntry
{
int num;
bool left,
up,
diag;
};
struct chartEntry** levenshtein(char *s1, char *s2, bool toPrint)
{
unsigned int s1Len,
s2Len,
i, //rows, general purpose index
j; //columns, general purpose index
s1Len = strlen(s1);
s2Len = strlen(s2);
/***********************************
Create and populate traceback chart
***********************************/
struct chartEntry chart [s1Len+1][s2Len+1];
//
// code to populate chart here
//
//prints expected number
printf("chart[3][3].num is %d", chart[3][3].num);
return chart;
}
void testFunction(char*s1,char*s2)
{
// both of these give segmentation faults
printf("[3][3].num is %d", levenshtein(s1,s2,false)[3][3].num);
struct chartEntry ** tmp = levenshtein(s1,s2,false);
printf("[3][3].num is %d", tmp[3][3].num);
}
最佳答案
这里有两个问题。首先,chart
是一个数组数组。这不能转换为指向指针的指针。数组和指针是不同的。您的行 return chart;
必须给您一个您不应忽略的编译错误。
其次,即使可以转换,chart
的内存对于levenshtein
函数也是本地的,当该函数返回时将不再存在。所以你会返回一个野指针。
你有两个选择:
- 使用
malloc
为chart
分配内存并返回一个指向它的指针(一个大块,或两层间接寻址) - 让调用者分配数组,
levenshtein
函数只是将值写入其中。
如果您使用第一个选项,那么您不应像第一次在 testFunction
中那样使用 printf
,因为内存不会被释放。您必须保存返回的指针,对其进行 printf,然后执行一系列 free
,这与您用于分配它的 malloc
序列相反。
关于c - 在 C 中访问传递的结构数组的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122877/