2014-10-19 79 views
0

當我嘗試通過malloc'main'的d字符指針在user_input中使用以獲取字符串時。 while循環完成後,我試圖打印filename。當它應該包含一個有效的字符串時,filename結束爲空。將Malloc字符指針傳遞給函數

void user_input(char *filename){ 
    char ch; 

    int i = 0; 

    printf("Fil att leta i: "); 
    while((ch = getchar()) == '\n'){ 
     filename = realloc(filename, (i+1) * sizeof(char)); 
     filename[i] = ch; 

     i++; 
    } 
    filename[i] = '\0'; 
    printf("filnamn = %s", filename); 

} 

int main(void){ 
    char *filename; 

    filename = (char *)malloc(sizeof(char)); 
    user_input(filename); 

    return 0; 
} 
+0

你知道,sizeof(char)被定義爲1.絕對沒有理由問一個'char'是否多於一個'char'大。 – Deduplicator 2014-10-19 19:14:44

回答

3

filename是一個按值傳遞的指針。當你這樣做的user_input功能

filename = realloc(filename, (i+1) * sizeof(char)); 

filenamemain不會改變。當您在main中打印filename時,指針已經實時顯示,因此您觸發了未定義的行爲。

您需要通過指針傳遞filename。因爲它已經是一個指針,你結束了一個雙指針:

void user_input(char **filenamePtr) 

現在,你需要採取一個指針在main

user_input(&filename); 

和間接引用在user_input

*filenamePtr = realloc(*filenamePtr, i+2); 

請注意,sizeof(char)總是1,所以你不需要乘以它。此外,您還可以將2,而不是1加到i,這樣您就可以爲空終止符'\0'字符提供足夠的空間。

1

更改此:

while((ch = getchar()) == '\n') 

到這一點:

while((ch = getchar()) != '\n') 

閱讀\n。你應該閱讀任何東西,但\n