Какие программные ошибки выделяет эта страница? - PullRequest
4 голосов
/ 09 августа 2009

http://dspace.dial.pipex.com/town/green/gfd34/art/bloopers.html

Первый кажется простым;

return strcpy(malloc(strlen(s)), s);

malloc может вернуть null, а strcpy может попытаться скопировать данные в адрес памяти 0. Или s может быть указателем на строку (а не массивом), а malloc выделит только достаточно место для указателя, и попытался бы скопировать строку в него. (Думаю).

А как насчет второго?

Какой позор, что он не бросил ch на неподписанный символ, когда написал ch = toupper (ch);

Зачем вам приводить ch к unsigned char, если вы пишете ch = toUpper(ch);?

Ответы [ 4 ]

6 голосов
/ 09 августа 2009

Первый кажется простым; таНос мог вернуть ноль, а strcpy мог попробуйте скопировать данные на адрес памяти 0. Или s может быть указателем на строку (а не массив) и malloc выделит достаточно места для указатель, и попытался бы скопировать Струна в это. (Думаю).

Достаточно просто, верно? Вы упустили самое очевидное, что не так с этим: вы не выделяете достаточно места. strcpy() копирует строку плюс завершающий нулевой байт , поэтому размер целевого буфера должен быть как минимум на 1 больше длины строки.

3 голосов
/ 09 августа 2009

Функция toupper (со строчной буквой U) принимает либо значение беззнакового символа, либо EOF. Если char подписан, передача char в toupper () без преобразования его в unsigned char сначала может передать другие значения с неопределенным поведением. Реализация toupper часто выглядит так:

int toupper(int c)
{
   return touppermap[c+1];
}

так что проблема здесь реальна. (Эта реализация предполагает, что EOF равен -1, что формально нельзя сделать, но ничто не мешает реализации быть осведомленной о своих собственных характеристиках).

1 голос
/ 09 августа 2009

Функция toupper ожидает, что аргумент будет представлен как unsigned char или значение EOF. signed char выше 127 будет рассматриваться как отрицательное число, если вы не преобразовали его в unsigned char, поскольку аргумент - int.

1 голос
/ 09 августа 2009

Функция toupper () ожидает, что ее входное значение будет целым числом в диапазоне без знака char (0 - 255), в то время как в некоторых случаях переменная char может находиться в диапазоне char со знаком (-128 - 127).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...