Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Есть у меня пример имплементации функции strcat: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Сперва указатель ret указывает на второй указатель (строку) dest; То есть например *dest="абв" и *ret="где". Потом указатель дест оказывается на последнем символе (байте). Вроде указатель dest оказывается на нуль-символе и дальше продолжатся не может. Однако начинается другой цыкл и он уже указывает на начало третьего указателя (второго масива символов) или присваивает уже значение следующим байтам (которые больше его длины) занчение сначала второй строки которая находится совсем в другой области памяти??? Как такое может быть -- может здесь надо варианты while (*rest++ = *src++) или (dest++ = src++)? Как возмиожно такое перескакивание? Проверить не могу -- выскакивает Segmentation Fault (Core Dumped), но хоть такой подход для реализации такой функции стандартный, много отзывов что это и не будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:04 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrt, Эта реализация правильная. Чтобы она работала, так же как и для стандартной strcat, первый указатель должен указывать на буфер способный вместить обе строки и завершающий ноль. И тогда не будет сегфолта ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:17 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Вот есть имплементация второй функции которая есть второй частью вышеприведенной функцииЖ char *strcpy(char *dest, const char *src) { char *save = dest; while(*dest++ = *src++); return save; } Здесь тоже идет присваивание указателя -- Наверное возможно и сразу написать while(*dest++ = *src++) -- но такой вариант ка-бы заблаговременно констатирует равность одних и тех же указателей. Одно -- дело когда они совпадают, но а если -- они находятся в разных областях памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:24 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Первый указатель должен указывать на буфер способный вместить обе строки и завершающий ноль. И тогда не будет сегфолта ))) -- для чего такая имплементация приведена если она неполная -- где полная? Касательно буфера -- он же там есть -- там три переменных указателя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:26 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrt- для чего такая имплементация приведена если она неполная -- где полная? Касательно буфера -- он же там есть -- там три переменных указателя. Это полная реализация. Просто вы неправильно вызываете функцию. Приведите вызывающий код и будет видно что не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:30 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Вот еще один вариант -- с вызовом. #include <stdio.h> char *strcat(char *dest, const char *src) { size_t i,j; for (i = 0; dest[i] != '\0'; i++) ; for (j = 0; src[j] != '\0'; j++) dest[i+j] = src[j]; dest[i+j] = '\0'; return dest; } int main() { char*s1="abc",*s2="def"; printf("%s",strcat(s1,s2)); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:32 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrtchar*s1="abc",*s2="def"; s1 указывает на константную память "abc" (4 байта) Функция strcat должна выполнять дополнение первого аргумента вторым. В вашем случае не только размер первого аргумента не достаточен, но и память недоступна для записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:41 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Как сделать правильно? Я этот пример не выдумал -- в нете не один такой. Вопрос в том тоже -- как же указатель дест разсширяется при помощи другого указателя, в тоже время когда йункция возращает третий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:50 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
memmove memcpy копирует байты (память), а как же тогда указатели скачут по разным областям памяти непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:54 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrtВопрос в том тоже -- как же указатель дест разсширяется при помощи другого указателя Он не расширяется. Указатель указывает на позицию в буфере. Сам указатель можно произвольно сдвигать куда нужно согласно алгоритма, но буфер при этом не расширяется. О буфере вы должны отдельно побеспокоиться. Читайте про работу с указателями. Вы пока не понимаете что это. А мне некогда объяснять. Вот пример корректного вызова. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 16:27 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Приведите мне этот буфер -- нужно ли знать его размер заблаговременно? Включает ли он последовательные ячейки памяти -- или он работает по принципу -- что он заполняется сплошной областю памяти, если надо перескочить на другую область памяти тогда он освобождается, и заполняется другими последовательными ячейками памяти. Например касательно неопределенного количества символов -- например для функции замены одного символа двумя, тремя и т.д. если неизвестно количсетво заменяемого символа в строке? Это задание выполнимо с помощью указателей а если надо заменить слова в предложение на обратный порядок (слово1 слово2 слово3)=>(слово3 слово2 слово1) -- применимы ли здесь указатели? Что здесь будет с буфером, или здесь вообще просто посколько известна или можно определить длину строки. То есть идет указатель с конца исходной строки до пробела, делает какой то маркер и во вложенном цыкле идет в обратном порядке заполняя первое слово, и при натыкание на пробел происходит выход из цыкла, и уже внешний указатель продолжает проход по предпоследнему слову и т.д. Это спрашиваю ибо использовал масив символом, хотя кажется что указатели здесь как раз кстати, не надо считать количсество букв в отдельном слове. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 03:04 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrt, вот набросок разворота слов в предложение (так к общей теме указателей): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Возвращает "ничего", компилится без ошибок. Очевидно надо возвратит dest в начало результирующей строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 04:31 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Извините, но вы рветесь в бой с автоматом Калашникова, кричите, что всех убьете, но при этом стрелять не умеете. Советую сначала почитать про выделение памяти и разницу между: Код: plaintext 1. и Код: plaintext 1. 2. 3. Также, советую почитать про calloc, realloc, free, new, delete, new[], delete[] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 09:49 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
ermak.nn, Читать -- читали. Если вы имеете ввиду что под указатель обязательно надо выделять память -- то это понятною Хотя из вышеприведеного кода, в начале, как-бы не следует это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 02:14 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Подразумевается, что память правильно выделена вызывающей функцией. И еще - "=" это присваивание, возвращающее результат, а сравнение на равенство пишется так "==" (и возвращает логический результат 0 или не ноль) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 08:53 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Говорить о разнице "=" и "==" это конечно интересно. Что значит память выделяется вызывающей функцией? Первый код в этой теме встречается сплош и рядом -- если надо еще какой то буфер, выделение память для чего морочить голову таким упрощенными вариантами. Насколько помню -- указатель указывает на ячейку памяти (динамической кучи), если после первого символа надо заполнить следующую ячейку, то вроде выделять не надо -- хотя если следующая ячейка памяти занята уже -- то это уже иная проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 16:38 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrt, это клиника. иди читай учебники для самых маленьких ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 16:47 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
Вы уверены, что вам нужен C или C++? Мне кажется, что нет, т.к. вы не понимаете, что за работу с памятью отвечает программист, и если он говорит программе выстрелить в ногу, она выстрелит. Вы этим и занимаетесь, хотя утверждаете, что "читали" про язык. Может всё-таки начать хотя бы с "Язык программирования Си" Брайан Керниган, Деннис Ритчи? Если нет, то увы. Конечно, можно попробовать изучить программирование наскоком, с кучей непонятных никому вопросов, но что-то хорошего из этого не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2017, 09:09 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
все таки спрошу -- что такое абсурдное, что я здесь написал? Что под любой указатель надо выделять память, даже под char*, в любом случае? Я с С/C++ сталкиваюсь так раз в полгода, так что не надо утрировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2017, 12:40 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrtвсе таки спрошу -- что такое абсурдное, что я здесь написал? Код: plaintext 1. Код: plaintext 1. 2. 3. 4. Это только то что в глаза бросилось. Дальше не стал вникать. Сомневаюсь на счет: arrtВозвращает "ничего", компилится без ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2017, 13:24 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrt, эта функция, как и большинство в языке "C" - опасная. И перед тем как ее использовать надо озаботиться достаточным объёмом буфера для dest. Кстати большинство атак на безопасность С/C++ приложений основаны на том что атакующий просто искусственно передаёт строку недопустимого размера. Я также настаиваю что-б вы вообще не использовали эти функции и этот язык по мере возможности. И нелишним будет также вам пройти базовый курс обучения С++. Это не в обиду а - совершенно искренне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2017, 19:20 |
|
||
|
Использование "раздельних" указателей
|
|||
|---|---|---|---|
|
#18+
arrtвсе таки спрошу -- что такое абсурдное, что я здесь написал? ... Я с С/C++ сталкиваюсь так раз в полгода, так что не надо утрировать. это не те языки, с которыми можно сталкиваться раз в полгода. .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2017, 07:26 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39435240&tid=2018212]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 272ms |

| 0 / 0 |
