C,free()的正确位置在哪里?

时间:2015-02-13 20:14:54

标签: c arrays pointers struct free

我知道我需要在某处使用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())或其他东西?

2 个答案:

答案 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中分配内存,然后构建一个指针并通过它填充它的数据,这样会更好。