阵列中的Malloc给出了分段错误

时间:2016-11-29 04:07:58

标签: c malloc

在我尝试理解malloc和结构时,我遇到了一个我不理解的错误

#include <stdio.h>
#include <stdlib.h>

typedef struct match
{
   int round;
} match;

void foo(match *matches) {
   for(int i = 0; i < 10; i++) {
      matches = (match *) realloc(matches, i + 1);
      matches[i].round = i + 1;
   }
}

int main()
{
   match *matches;

   matches = (match *) malloc(0);

   foo(matches);

   free(matches);

   return(0);
}

因此,在我尝试动态填充此匹配数组时,它失败了

2 个答案:

答案 0 :(得分:2)

您的foo功能存在很大缺陷。首先,该参数传递matches指针的副本,因此当您重新分配时,它会更新foo matches指针,而不是matches中的main指针}。这可能会导致主要free出现问题。您需要将参数更改为foo为双指针:void foo(match **matches)。然后重新分配*matches = realloc(...

接下来,realloc的第二个参数是一个大小。但是i + 1对于match结构的完整副本来说还不够大。您可能打算做sizeof(struct match) * (i + 1)

之类的事情

答案 1 :(得分:1)

我除了上面的回答。很好的解释... 在使用内存之前,请检查realloc中的错误

修改程序

void foo(match **matches) {
   for(int i = 0; i < 10; i++) {
      *matches = realloc(*matches, (i+1) * sizeof(match));
      ...
   }
}

int main()
{
...

   foo(&matches);
...
}