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

标签 c arrays pointers struct

我有一个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/

相关文章:

c++ - 返回一个Type,或者如何保存一个对象指针的类型?

c++ - 与动态内存分配 C++ 混淆

c - 使用原始套接字和 WinPcap 发送 HTTP 请求

javascript - .find() 多选器不能添加prop

时间:2019-03-08 标签:c++rand()%100

Java:将整数从文件读入数组

c++ - 使用指针的数组长度

C 编程输入错误,scanf 跳过

c - 在c中构建未知长度的大字符串

c - 使用 malloc.c 的堆分配内存边界