【问题标题】:C, Where is the correct spot for free()?C、free() 的正确位置在哪里?
【发布时间】:2015-02-13 20:14:53
【问题描述】:

我知道我需要在这里的某个地方使用 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);
    }
}

我想在 function1() 的末尾使用它,在 print 语句之后,但是那里的上下文仍然可用吗?我不相信我可以在 build() 结束时释放 (*infoArr),因为我需要在其他地方访问该数组,这就是 build() 的重点。 build() 旨在用于多个功能。如果我在 function1() 的末尾使用 free(),我是使用 free(infoArr) 还是 free(build()) 或完全使用其他东西?

【问题讨论】:

    标签: c arrays pointers struct free


    【解决方案1】:

    此外,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);
    

    【讨论】:

      【解决方案2】:

      您必须保存 build() 返回的指针,并在循环后释放它。在循环之前在函数 1 中分配内存会更好的风格,让 build 接受一个指针并通过它填充它的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-26
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多