2014-10-19 43 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