在我尝试理解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);
}
因此,在我尝试动态填充此匹配数组时,它失败了
答案 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);
...
}