我知道我需要在某处使用free(),但我不确定在哪里。
struct info{
char string1[30];
float float1;
int int1;
char string2[30];
};
struct info* build(){
FILE *data;
int i, lines;
lines=0;
data=fopen("hw3.data","r");
struct info info;
struct info *infoArr;
infoArr = (struct info*)calloc(lines,sizeof(struct info));
for(i=0; i<2; i++){ //change not to 2
fscanf(data, "%s %f %d %s", info.string1, &info.float1, &info.int1, info.string2);
strcpy(infoArr[i].string1, info.string1);
infoArr[i].float1 = info.float1;
infoArr[i].int1 = info.int1;
strcpy(infoArr[i].string2, info.string2);
}
fclose(data);
return infoArr;
}
void function1(){
int i; for(i=0; i<2; i++){
printf("%s %f %d %s\n", build()[i].string1, build()[i].float1, build()[i].int1, build()[i].string2);
}
}
我想在print1语句之后的function1()末尾使用它,但是上下文仍然可用吗?我不相信我可以在build()结束时释放(* infoArr),因为我需要在其他地方访问该数组,这是build()的重点。 build()旨在用于多个函数。如果我在function1()的末尾使用free(),我是否完全使用free(infoArr)或free(build())或其他东西?
答案 0 :(得分:3)
此外,您对printf()
的每个参数都使用不同的结构,因为您反复调用build()
。您应该在循环之前调用build()
一次,将其分配给变量,然后遍历变量。
struct info* temp = build();
for (i = 0; i < 2; i++) {
printf("%s %f %d %s\n", temp[i].string1, temp[i].float1, temp[i].int1, temp[i].string2);
}
free(temp);
答案 1 :(得分:1)
你必须保存build()返回的指针,并在循环后释放它。虽然在循环之前在函数1中分配内存,然后构建一个指针并通过它填充它的数据,这样会更好。