2015-05-19 2 views
0

В следующем сегменте кода:добавления указатель на целое число в C

if (buffer + strlen(buffer) >= len -1) beep(); 

примечание: len является int, buffer является указателем на char.

Я не понимаю, как кто-то добавит буфер (указатель) в строку strlen() строки и сравните ее с len. Кто-нибудь может мне помочь, пожалуйста. Примечание: фактическая кодовая ссылка http://www.finseth.com/craft/#intro.1.4 любая помощь будет принята с благодарностью.

+0

строка кода в выражении «если» - это бессмысленность. предположим: '' if (strlen (buffer)> (len-1)) beep(); «Однако, к тому времени, когда это условие будет« истинным », буфер будет проходить через конец« текстового »литерала, что приведет к неопределенному поведению и может/приведет к событию сбоя seg – user3629249

+0

. Обратите внимание, что инструкция« if » в значительной степени зависящей от предсказуемости операторов С. Было бы намного яснее для людей, если бы был включен другой набор или два из парен. – user3629249

+0

@ user3629249 общеизвестно, что арифметические операторы имеют более высокий приоритет, чем реляционные, я сомневаюсь, что кто-то смотрит на это и думает, что это может быть «buffer + (strlen (buffer)> = len) - 1' –

ответ

3

Этот код является незаконным. Указатель не может сравниваться с целым числом (кроме константы 0). Компилятор должен был сгенерировать сообщение об ошибке.

Некоторые компиляторы могут генерировать «только» предупреждение в конфигурации по умолчанию и выполнять бессмысленное сравнение во время выполнения, но вы должны рассматривать это как ошибку.

Вы можете сообщить об этом ошибке автору этой страницы; хотя, если основные ошибки компиляции проходят через процесс QA, я ненавижу думать о том, какие другие ошибки могут присутствовать.

0

Это называется указатель арифметика, это по существу такой же, как

if (&buffer[strlen(buffer)] >= len - 1) 

, который очень некрасиво строку кода в обеих версиях.

Почему они сравнивают его len - 1 является мистерией, если len не переписывается от исходного значения, или программист точно знает, что адрес "text" есть, который будет зависеть от компилятора AFAIK.

+0

Не могли бы вы взглянуть на фактический код? это из книги, названной ремеслом редактирования текста, и ссылка на код: http://www.finseth.com/craft/#intro.1.4 –

+6

В дополнение к тому, чтобы быть уродливым, это также ошибка. 'buffer + strlen (buffer)' является указателем, но его сравнивают с целым числом 'len-1', что вряд ли приведет к чему-либо значимому. –

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