Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Сначала приводится такой код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ЖЁСТКОЕ ПОРНО ВЫРЕЗАНОK&RSTRCPY(S, T) /* COPY T TO S; POINTER VERSION 1 */ CHAR *S, *T; WHILE ((*S = *T) != '\0') S++; T++; с ним я согласен. Далее Код: plaintext 1. 2. 3. 4. 5. ЖЁСТКОЕ ПОРНО ВЫРЕЗАНОK&RSTRCPY(S, T) /* COPY T TO S; POINTER VERSION 2 */ CHAR *S, *T; WHILE ((*S++ = *T++) != '\0') ; Полностью ли корректен данный код ? Вспоминается пример. Код: plaintext 1. 2. Ниже идёт комментарий : K&RЗдесь увеличение S и T внесено в проверочную часть. Значением *T++ является символ, на который указывал T до увеличения; постфиксная операция ++ не изменяет T, пока этот символ не будет извлечен. Точно так же этот символ помещается в старую позицию S, до того как S будет увеличено. Конечный результат заключается в том, что все символы, включая завершающий \0, копируются из T в S. Перечитал этот текст три раза, понял. И слева и справа происходит работа со старыми значениями, и только потом происходит инкремент. Но если вы более пристально его изучите, то вы обратите внимание на то, что нигде не делается комментариев на то, что массивы должны быть равны. Я это заметил только в следующем примере: K&RSTRCPY(S, T) /* COPY T TO S; POINTER VERSION 3 */ CHAR *S, *T; WHILE (*S++ = *T++) ; 1 вопрос. Мне кажется что лучше узнать длину массива S (SIZEOF), сравнить с длиной T, и уже в дальнейшем в зависимости от полученных значений либо выводить сообщение о невозможности копирования, либо продумать варианты. Вы наверное знаете что будет если попытаться скопировать массивы разной длины, я не знал. Хотя результат вероятно зависит от архитектуры. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. на экране появились мои defjk и также Debug Error следом, но фактически, как я понял,j and k попали в те ячейки где совсем не должны были находиться и возможно что-то переписали. Это верно ? Прокомментируйте пожалуйста рассуждения, в чём я ошибаюсь или не ошибаюсь? 2. Вообще не нравится конструкция while (*s++ = *t++); У меня сразу чувство что я буду путешевствовать по всем ячейка памяти. Хотя, видимо компилятор действительно знает что это массив, и если длины массивов одинаковые, то всё ок. Это нормальная конструкция в целом ? Насколько она безопасная ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 07:25 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury2. Вообще не нравится конструкция while (*s++ = *t++); У меня сразу чувство что я буду путешевствовать по всем ячейка памяти. Хотя, видимо компилятор действительно знает что это массив, и если длины массивов одинаковые, то всё ок. Это нормальная конструкция в целом ? Насколько она безопасная ? Эта конструкция предназначена только для строк. Т.е. в исходном буфере по любому встретится 0. Буфер на который указывает s должен быть не меньше буфера t. Проверить это никак нельзя, поэтому функция и не проверяет. В случае если буфер будет меньше чем надо либо если в исходной строке нет завершающего нуля, то будет выход за границы массива, которое в С/С++ является UB (undefined behavior). Не допустить этого - задача вызывающего кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 09:01 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Первый приведенный кусок кода не корректен и быстро приведет к segmentation fault. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 09:26 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, выложи код в нормальном виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:03 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
wst как гостэSashaMercury, Первый приведенный кусок кода не корректен и быстро приведет к segmentation fault. код без базара некорректен, потому что скобок нет . были бы скобки, == был бы корректер на 100 % ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:07 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, так я просто копирую из книги(Она у меня в формате pdf ) Тоже раньше не понимал почему так, но потом понял, код следует трактовать так: K&R STRCPY(CHAR *S, CHAR *T) { WHILE ((*S = *T) != '\0') S++; T++; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:10 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Скобки опять забыл :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:25 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Там не только скобок не хватает, еще и буквы слишком заглавные, если определять условием корректности кода как минимум его компилируеиость без кучи дефайнов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:43 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Ну что такое :)Исправил Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Ответьте ещё на этот вопрос, пожалуйста ) S как я понял,j and k попали в те ячейки где совсем не должны были находиться и возможно что-то переписали. Это верно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:17 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryОтветьте ещё на этот вопрос, пожалуйста ) S как я понял,j and k попали в те ячейки где совсем не должны были находиться и возможно что-то переписали. Это верно ? k и \0. Строка в С обязательно завершается нулевым символом, поэтому str1[] = 'abc\0', а str2[]= 'defjk\0'. По сути же, верно мыслишь. P.S. Ссылку на первоисточник опять потребуешь? ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:29 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
В отладочном коде некоторые компиляторы оставляет вокруг данных в стеке свободное место и вставляют в код проверки что в эти области никто не писал. Аналогично для динамически выделяемой памяти. 'j' и 'k' попали в это свободное место. В релизе они просто попортили бы данные в стеке, дальнейшее уже в общем случае предсказать невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:34 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. Какой смысл постить этот мусор из заглавных букв? Постите то что вы пробуете компилировать, а не копируйте из книги. И что за книга такая - выкинуть нафик и взять нормальную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:37 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Понял ))) egorych , не потребую ) Dima_T, White Owl, Anatoly Moskovsky, MasterZiv , mayton, Dimitry Sibiryakov, egorych Всем спасибо за помощь на этой неделе! Вы сделали меня умнее. Всем хорошо отдохнуть ! Dima_T, вам ещё раз отдельно спасибо, за чудесное настроение после разбора прекрасного примера ! Когда вспоминаю ту задачку, сразу улыбаюсь C: S ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:52 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky... И что за книга такая - выкинуть нафик и взять нормальную. Неужели уже выросло поколение, для которого K&R буквы не о чём? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:02 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
pureproftНеужели уже выросло поколение, для которого K&R буквы не о чём? Если в книге по С написано WHILE то неважно кто автор :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:17 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
pureproftAnatoly Moskovsky...И что за книга такая - выкинуть нафик и взять нормальную.Неужели уже выросло поколение, для которого K&R буквы не о чём?поновее издание найди ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:20 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, брошу свои пять копеек :-) автор1 вопрос. Мне кажется что лучше узнать длину массива S (SIZEOF), сравнить с длиной T, и уже в дальнейшем в зависимости от полученных значений либо выводить сообщение о невозможности копирования, либо продумать варианты. Вы наверное знаете что будет если попытаться скопировать массивы разной длины, я не знал. Хотя результат вероятно зависит от архитектуры. sizeof - размерность типа данных покажет, не так ли? поэтому чтобы узнать полный размер буфера нужно выполнить sizeof(type) * n, где n количество элементов массива, тогда получается, что нам нужно передавать этот самый n в функцию. И соответственно нужно передавать n и для источника и для приемника, чтобы на это не заморачиваться было решено, что эта головная боль ложится на плечи программиста вызывающего функцию, он должен следить чтобы память была выделена в нужном объеме. Если копировать данные и приемник окажется меньше источника, то произойдет переполнение буфера. Переполнение весьма интересная штука, о которой много писалось, например: http://ru.wikipedia.org/wiki/Переполнение_буфера http://www.xakep.ru/post/23646/ 2. Вообще не нравится конструкция while (*s++ = *t++); У меня сразу чувство что я буду путешевствовать по всем ячейка памяти. Хотя, видимо компилятор действительно знает что это массив, и если длины массивов одинаковые, то всё ок. Это нормальная конструкция в целом ? Насколько она безопасная ? Конструкция безопасна, если ее использовать соблюдая все требования - размеры буферов и терминальный символ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:39 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryMasterZiv, так я просто копирую из книги(Она у меня в формате pdf ) Тоже раньше не понимал почему так, но потом понял, код следует трактовать так: K&RSTRCPY(CHAR *S, CHAR *T) { WHILE ((*S = *T) != '\0') S++; T++; } Мать, мать, мать ;%;*;%:;:%;? ! Где блин ты видел код на С в верхнем регистре ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:37 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПолностью ли корректен данный код ? Вспоминается пример. Код: plaintext 1. 2. Данные примеры полностью корректны и правильны (по крайней мере я не заметил ничего плохого). И процитированный мной кусок тоже правильный, что вообще тебе там не нравится ? Проблемы с подобным кодом бывают, когда в одном операторе есть более чем один побочнй эффект, затрагивающий один и тот же объект (переменную). По науке это называется "более одного побочного эффекта до ближайшей точки следования". Вот тогда будут проблемы. А что плохого ты видишь в приведённом коде ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:45 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Код: plaintext 1. должно быть Код: plaintext 1. const -спецификации давно уже есть и в чистом С, привыкай ВСЕГДА их использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:48 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, авторна экране появились мои defjk и также Debug Error следом, но фактически, как я понял,j and k попали в те ячейки где совсем не должны были находиться и возможно что-то переписали. Это верно ? Прокомментируйте пожалуйста рассуждения, в чём я ошибаюсь или не ошибаюсь? При копировании буфера большего размера в буфер меньшего размера (на два символа) произошло переполнение приёмного буфера, это привело к защите памяти и остановке программы. Печально то, что происходит ошибка при таких условиях далеко не всегда: в release режимах ничего не проверяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:51 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
[quot pureproft]Anatoly Moskovsky... Неужели уже выросло поколение, для которого K&R буквы не о чём? Я кстати не читал ни K&R , ни даже почти не читал Страустрапа. Ничего, живу как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:53 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
novexelf2. Вообще не нравится конструкция while (*s++ = *t++); У меня сразу чувство что я буду путешевствовать по всем ячейка памяти. Хотя, видимо компилятор действительно знает что это массив, и если длины массивов одинаковые, то всё ок. Это нормальная конструкция в целом ? Насколько она безопасная ? Это -- классическая реализация strcpy из первых юниксов, ничего некорректного тут нет. Наоборот, во всех книгах приводится как пример того, насколько выразителен язык С. (выразителен -- значит кода мало, а делает он много). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:55 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. Сначала приводится такой код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Даже этот код я бы назвал извратом, не говоря о более компактных написаниях. Код должен быть читабельным, а в данном плане маркетинг с++ жертвует читабельностью чтобы показать компактность. Это именно маркетинг, т.к. есть более понятные написания с такой же производительностью. Надо уметь эти извраты понимать, но писать их не советую, подумай о тех кто будет читать твой код после тебя. Любой нездоровый код (с точки зрения читабельности) можно писать только в одном случае - если нужна бОльшая производительность. Во всех остальных случаях лучше отдать приоритет читабельности кода. Т.е. это лучше писать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Да, это длинно и нудно, но зато понятно всем, даже тем кто мало знаком с Си. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 20:36 |
|
||
|
K&R 5.5 Указатели символов и функции. Корректен ли код ?
|
|||
|---|---|---|---|
|
#18+
Dima TДа, это длинно и нудно, но зато понятно всем, даже тем кто мало знаком с Си. А мне слету понятна конструкция "while (*s++ = *t++)" а в вашу надо вдумываться чтоб понять. Так что не надо ту про читаемость :) ЗЫ. Есть такое понятие идиома. Это то что новичек не знает, а опытные понимают с полслова. "*s++ = *t++" - это идиома, ее не надо перефразировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 21:40 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=65&tid=2019697]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
143ms |
get tp. blocked users: |
2ms |
| others: | 28ms |
| total: | 263ms |

| 0 / 0 |
