2014-09-11 2 views
1

Я уверен, что здесь просто глупая ошибка, однако я не могу понять это. Это часть моего кода:scanf использует неинициализированную переменную; C

char *moving; 
scanf("%s", moving); 

Когда я скомпилировать его с GCC, он говорит следующее:

newmatrix.c:38:7: warning: ‘moving’ is used uninitialized in this function [-Wuninitialized] 

Линия 38 является зсапЕ

Как это исправить? Thanks

+2

'moving' является указателем. На что это указывает? Ничего. Это то, что компилятор пытается вам рассказать. –

ответ

3

Перед использованием памяти выделите память для moving. Используйте malloc().

moving является указателем char тип. Перед сохранением строки в moving вам необходимо выделить память.

char *moving; 
moving = malloc(100); 
scanf("%s", moving); 

ИЛИ

Просто измените char *moving на char moving[256].

Также вместо scanf()fgets().

+0

Лучше использовать 'scanf («% 99s », перемещение);' но я бы порекомендовал 'getline' (это не то же самое, что' scanf', который останавливается в пробелах). –

+0

Спасибо, что сработало: D –

1

выделить память для указателя перед использованием его

char *moving; 
moving = malloc(100*sizeof(char)); 
scanf("%s", moving); 
+0

'sizeof (char)' по определению 1. И почему 'malloc'? Учитывая информацию в вопросе, 'char moving [100];' работает так же хорошо. – Praetorian

+0

Я дал malloc, потому что он, похоже, хочет использовать указатели. и, sizeof (char) - 1 путем defination, вот почему я дал 100 * sizeof (char) – Haris

+0

Ну, OP тоже смущен очень простым предупреждением, поэтому он, кажется, новичок, и то, что он * хочет использование * не обязательно то, что он * должен использовать *. И вы написали '100 * 1' заведомо, потому что это более выразительно, чем писать' 100'? – Praetorian

5

Вы можете выделить память перед вызовом scanf(). Например:

char moving[256]; 
if (scanf("%255s", moving) != 1) 
    …oops — presumably EOF… 

Вы можете использовать malloc() вместо простого массива, но тогда вы должны помнить, чтобы освободить выделенную память. OTOH, если вы хотите вернуть данные из функции, где она читается, может быть удобнее использовать malloc(), но подумайте о передаче указателю на пробел (и его размер?) На функцию.

Или вы можете иметь scanf() сделать распределение памяти для вас (проверьте страницу руководства для scanf() внимательно - читать каждую неделю до тех пор, пока вы запомнили (достаточно) его):

char *moving; 
if (scanf("%255ms", &moving) != 1) 
    …oops — probably EOF, but perhaps OOM (out of memory)… 
…use moving… 
free(moving); 

Да, это один из наименее известных опций в стандарте POSIX scanf(); он не является частью стандарта C.

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