2014-10-19 4 views
0

Когда я пытаюсь передать указатель malloc 'd char от main для использования в 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

ответ

3

filename - указатель, который передается по значению. Когда вы сделаете это в user_input функции

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

filename в main не меняется. Когда вы печатаете filename в main, указатель был перераспределен, поэтому вы запускаете неопределенное поведение.

Вы должны пройти 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.

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