2016-06-14 2 views
-2

Так что я написал эту функцию:Uninitialized символ недобросовестный @

int getword(char *fmt, int delim, int max, FILE *f) 
{ 
    int c, x = 0; 
    while (((c = getc(f)) != EOF) && (c != delim) && (x < max)) 
      fmt[x++] = c; 
    return x; 
} 

Всякий раз, когда я проверить функцию, всегда есть @ в конце.

buf = color [email protected] 
/* segmentation fault */ 

и независимо от того, что я сделал, чтобы изменить его значение переменной всегда будет заканчиваться @. Я исправил эту проблему путем инициализации переменной:

char buf[100] = {0}; 

, но с тех пор, как я задавался вопросом, почему персонаж всегда был @ если неинициализированная char может быть что-нибудь в своем диапазоне. Почему он по умолчанию равен @?

+3

Неопределенное поведение не определено. –

ответ

1

вам необходимо обнулить прекратить вашу строку

int getword(char *fmt, int delim, int max, FILE *f) 
{ 
    int c, x = 0; 
    while (((c = getc(f)) != EOF) && (c != delim) && (x < max)) 
      fmt[x++] = c; 
    fmt[x] = 0; 
    return x; 
} 

вы получаете «@», потому что то, то, что осталось в памяти, почти наверняка скорлупа или погрузчик. И так как оболочка или загрузчик одинаковы каждый раз, когда вы получаете один и тот же случайный кусок мусора. Если вы немного смешаете свою программу (добавьте несколько дополнительных переменных перед баффом), вы получите другой кусок хлама.

0

Чтение из неинициализированной локальной переменной вызывает Неопределенное поведение. Программа может делать все, что захочет.

+0

, но UB приведет к случайному характеру, не так ли? И переменная не была полностью неинициализирована; это было написано «getword». – 112

+2

@ ProHackr112 "undefined" не означает "случайный" –

1

Исходный код не имеет очистки buf[] и даже char buf[100] = {0}; не обеспечивает завершение нулевого символа при чтении 100 символов. Else printf("buf is %s\n",buf); пытается напечатать потенциально недопустимую строку.

Кроме того, при последующих вызовах char buf[100] = {0}; не переустанавливает массив.

Лучше использовать getword(buf,'>',sizeof buf - 1,f); и имеют getword() Добавить '\0'.


Почему это по умолчанию @

Это неопределенное поведение. В вашем случае, вероятно, buf[] содержал '@', но все могло случиться. Он не по умолчанию до '@'.

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