2014-02-18 51 views
2

我所做的只是在c(char * )中啓動一個雙指針來保存我的字符串數組。我將這個變量(char * array_strings)傳遞給另一個函數,該函數應該打開一個文件並創建一個表示文件每一行的字符串數組,但由於某種原因,當我從函數返回變量array_strings爲null時。未指定的指針

int main(void) { 
    char **array_strings; 
    char *book_file = "book.txt"; 
    delimitByNewline(book_file, array_strings); 
    return 1; 
} 

//delimit file 

void delimitByNewline(char *book, char **array) { 
    int count = 0; 
    int i = 0; 
    char c; 
    int size = fileLines(book); 
    srand(time(NULL)); 
    char **ret_array = (char **)malloc(sizeof(char *) * size); 

    FILE *bk = fopen(book, "rt"); 
    if(!bk) { 
     perror("fp"); 
     exit(1); 
    } 

    char *line = (char *)malloc(sizeof(char)*60); 

    while ((c = fgetc(bk)) != EOF) { 
     line[i] = c; 
     i++; 
     if(c == '\n') { 
      ret_array[count] = line; 
      line = (char *)malloc(sizeof(char) * i); 
      count++; 
      i = 0; 
     } 

    } 

    fclose(bk); 
    array = ret_array; 
    free(line); 
    free(ret_array); 
} 
+2

「開始」是你在學校廁所對新生做的事情。 「初始化」是你對C中變量的處理。 –

+0

請注意,函數末尾的'free(ret_array)'會刪除你嘗試返回的數據。 – Machtl

+0

初始評論是非常有用的....謝謝。無論如何,是的,甚至在我添加空閒之前,數組的值仍然爲空。但是我會重新編譯它以確保 –

回答

1

函數void delimitByNewline(char* book,char** array)參數類型不正確。您正在傳遞地址並寫入類型爲char * & char **

FILE *bk = fopen(book,"rt");什麼是文件訪問模式下的t

+0

''rt''是一個等效於''r「'的Windows主機用於讀取文本文件(與用於讀取二進制文件的''rb''相反)。在Unix上二進制文本與文本的區別並不重要。 C標準通過不指定「b」來支持「隱式」文本模式。 –

4

由於您在函數中分配集合,因此您需要將其返回給調用者。

我建議改變從void返回簽名char **和改變流動到這一點:

char** delimitByNewline(char* book){ 
    char** ret_array = (char **)malloc(sizeof(char *)*size); 
    // .. assign the strings, don't free! 
    return ret_array; 
} 

,並呼籲像這樣:

char* book_file = "book.txt"; 
char** array_strings = delimitByNewline(book_file); 

(並請注意@ JonathanLeffler的評論 - 所有權的堆分配ret_array傳回給呼叫者 - 即呼叫者必須free,而不是delimitByNewLine()。!)

編輯

如果你真的想通過數組作爲out參數,你需要傳遞原始指針的地址,因爲該功能將需要它來分配malloc版的地址陣列即:

char **array_strings = 0; // NULL 
char *book_file = "book.txt"; 
delimitByNewline(book_file, &array_strings); 
// do stuff 
// free strings + array 

然後需要解除引用分配它。

void delimitByNewline(char *book, char ***array) { 
    *array = (char **)malloc(sizeof(char *) * size); 
    // ... Don't free 
+3

在返回之前,請確保你沒有'free(ret_array)'! –

+0

好吧,我會嘗試。但是有沒有辦法通過將變量的地址賦值爲新值來實現? –

+0

哇,我的意思是將變量的地址更改爲新的 –