在我尝试理解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);
}
因此,在我尝试填充这种动态匹配的尝试时,它失败了
您的foo
功能非常有缺陷。首先,参数传递了matches
指针的副本,因此,当您进行realloc时,该副本会更新foo
matches
指针,而不是main
中的matches
指针。这可能会导致free
的主要问题。您需要将参数更改为foo
成为双重指针:void foo(match **matches)
。然后到realloc, *matches = realloc(...
接下来,realloc
的第二个参数是大小。但是i + 1
将不够大,用于match
结构的完整副本。您可能打算做诸如sizeof(struct match) * (i + 1)
。
i在上述答案中添加。很好的解释...在使用内存之前,请还检查Realloc的错误,
修改了程序
void foo(match **matches) {
for(int i = 0; i < 10; i++) {
*matches = realloc(*matches, (i+1) * sizeof(match));
...
}
}
int main()
{
...
foo(&matches);
...
}