2014-03-03 123 views
0

對C很新穎,我試圖弄清楚(對於任務)如何正確使用結構和函數。 特別是,我遇到了麻煩,如何從函數傳遞結構數組。傳遞函數結構數組

函數應該從文件中獲取數據並將其輸入到數組中。輸入文件具有以下數據:的Al 比爾克拉克迪安埃倫

我調用該函數後,我想是能夠在查看的數組值主要功能。

我不認爲我正確地傳遞了結構,但不知道我要出錯的地方。 有什麼建議嗎?謝謝。

這裏是我的代碼的嘗試:

// Input file into array 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    int number; 
    char name[30]; 
} Name; 

#define SIZE 5 

// function prototypes 
int loadName(char *file, Name N[]); 

// function main begins program execution 
int main(void) 
{ 
    char file[ 30 ]; // file name 
    Name N[ SIZE ]; // array to store names 
    size_t i, j=0; // counter 

    // check read function opens file correctly 
    if (-1 == (i = loadName (file, N))) { 
    puts("Employee file could not be opened"); 
    } // end load if 

    printf("\n\nCheck for names in main function\n\n"); 

    for (j=0; j<i; ++j) { 
     printf("%8d%18s\n", N[j].number, N[j].name); 
    } 
    return 0; 

    free(N); 
} 


// load values from name file 
int loadName(char *file, Name N[]) 
{ 
    FILE *inPtr; // inPtr = input file pointer 
    size_t i = 0; // counter 

    // fopen opens file. Exit program and return -1 if unable to open file 
    if ((inPtr = fopen("name.txt", "r")) == NULL) { 
     return -1; 
    } // end if 
      else { 
       printf("Employee Number Employee Name\n"); 
       // read name from file 
     do { 
     N = (Name*)malloc(100); 
      fscanf(inPtr, "%d%s", &N[i].number, &N[i].name); 
      printf("%8d%18s\n", N[i].number, N[i].name); 
      i++; 
     } while (!feof(inPtr)); 

      } // end else 
      fclose(inPtr); // fclose closes the file 
      return i; // return i after successful for loop 
} // end function loadname 

回答

2

你要記住,數組衰變爲指針,所以在loadName函數變量N實際上是一個指針,且行爲與其他任何局部變量。這意味着如果您重新分配它,則只會重新分配指針的本地副本。這是第一件事。

第二件事是你傳遞一個指向已經分配的內存的指針,一個包含五個結構的數組。無需在函數內再次分配。

這將我引向第三件事,即在循環的每次迭代中分配,從而放棄先前的分配和泄漏內存。

儘管如此,您應該注意,因爲您傳遞的數組只能爲五個結構分配空間,如果您嘗試讀取的數據超出了數組限制,並且會導致緩衝區溢出所謂的未定義的行爲