2015-02-13 2 views
0

Я знаю, что мне нужно использовать free() здесь где-то, но я не знаю, где.C, Где находится правильное место бесплатно()?

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(), после того, как заявление для печати, но контекст по-прежнему будет доступен там? Я не уверен, что могу освободить (* infoArr) в конце build(), поскольку мне нужно получить доступ к этому массиву в другом месте, что является целым рядом с build(). build() предназначен для использования в нескольких функциях. Если я использую free() в конце функции1(), я использую бесплатный (infoArr) или свободный (build()) или что-то еще полностью?

ответ

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

Вы должны сохранить указатель, возвращенный функцией build(), и освободить его после цикла. Было бы лучше стиль, хотя бы выделить память в функции 1 перед циклом, построить сборку с помощью указателя и заполнить его данными.

Смежные вопросы