gpt4 book ai didi

c - 在 C 中访问传递的结构数组的成员

转载 作者:太空宇宙 更新时间:2023-11-04 08:42:14 24 4
gpt4 key购买 nike

我有一个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 函数也是本地的,当该函数返回时将不再存在。所以你会返回一个野指针。

你有两个选择:

  • 使用 mallocchart 分配内存并返回一个指向它的指针(一个大块,或两层间接寻址)
  • 让调用者分配数组,levenshtein 函数只是将值写入其中。

如果您使用第一个选项,那么您不应像第一次在 testFunction 中那样使用 printf,因为内存不会被释放。您必须保存返回的指针,对其进行 printf,然后执行一系列 free,这与您用于分配它的 malloc 序列相反。

关于c - 在 C 中访问传递的结构数组的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com