Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Всем привет! Пытаюсь заполнить массив char в другой функции, и вернуть его значение в вызывающую функцию - не получается. Такое возможно вообще? Для int все работает четко. void f1(char *v) { v="jh"; } void f1(int *v) { *v=5; } void main() { char *myString = new char[100]; int *myInt = new int[10]; f1(myString); f1(myInt); cout<<myString; cout<<*myInt; } сout<<myString выводит мусор, cout<<*myInt выводит 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 19:17 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Вы в функции копируете указатель на строку в локальную переменную (а аргументы - это локальные переменные), значение которой при выходе из функции теряется. Вместо этого надо копировать саму строку в переданный массив с помощью strcpy Код: plaintext 1. 2. 3. 4. А лучше использовать std::string для строк. PS. Используйте тег SRC для выделения кусков кода в сообщениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 19:39 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Вы в функции копируете указатель на строку в локальную переменную (а аргументы - это локальные переменные), значение которой при выходе из функции теряется. Вы имеете ввиду, что внутри функции f1 создался новый массив символов "jh", потом указатель на этот массив был скопирован в указатель v, а при выходе из функции созданный массив символов "jh" был удален? Спасибо! Сейчас попробую с использованием strcpy. PS. Используйте тег SRC для выделения кусков кода в сообщениях. Всегда использую, просто иногда забываю, а редактировать созданный пост нельзя :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 20:02 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_GВы в функции копируете указатель на строку в локальную переменную (а аргументы - это локальные переменные), значение которой при выходе из функции теряется. Вы имеете ввиду, что внутри функции f1 создался новый массив символов "jh", потом указатель на этот массив был скопирован в указатель v, а при выходе из функции созданный массив символов "jh" был удален? Не совсем (см. в соседнем топике про присвоение строки в указатель ). Но суть не в этом, а в том что присвоение в локальную переменную никак не влияет на значение переменной в вызывающем коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 20:31 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Ага, спасибо. Еще один уточняющий вопрос. Если константа вводиться через cin, тогда так делать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 20:43 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, То что вводится - это по определению не константа. Так что вводите сразу в переданный указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 20:55 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Отлично, заработало! :) Спасибо большое! У меня просто такой кусок был: Код: plaintext 1. 2. 3. 4. 5. 6. Переделал последнюю строчку на Код: plaintext 1. Так что вводите сразу в переданный указатель. Правильно ли я понимаю, что указатель должен указывать на динамический массив длинной больше, чем то, что будет введено через cin ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 21:11 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_GПравильно ли я понимаю, что указатель должен указывать на динамический массив длинной больше, чем то, что будет введено через cin ? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 21:19 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Спасибо! Удачи! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2012, 22:35 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_G, Вы в функции копируете указатель на строку в локальную переменную (а аргументы - это локальные переменные), значение которой при выходе из функции теряется. Вместо этого надо копировать саму строку в переданный массив с помощью strcpy Код: plaintext 1. 2. 3. 4. Кто-то может подсказать, что имелось ввиду в выделенном предложении? Я могу предположить, что это как-то связанно с объяснением Anatoly Moskovsky . Anatoly MoskovskyМы можем объявить явно массив char и присвоить ему строку/массив. В этом случае создается копия , которая уже не константа. Код: plaintext 1. у Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2012, 12:59 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
up :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2012, 00:34 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Первая цитата не имеет отношение ко второй (хотя и там и там - копирование) Допустим у вас есть функция Код: plaintext 1. 2. 3. или даже чтобы вы не отвлекались на указатель, возмем какой-то другой тип Код: plaintext 1. 2. 3. Когда вы вызываете f1 и передаете в нее значение: Код: plaintext 1. 2. то происходит так называемая передача параметра "по значению". Она заключается в том что переданное значение x копируется в v . Т.е. это теперь два отдельных значения хранящихся в разных переменных. Теперь если функция модифицирует аргумент, то модифицируется копия, а не оригинальная переменная переданная в функцию Код: plaintext 1. 2. 3. 4. 5. 6. Теперь вернемся к указателям. Вот у вас был первоначально код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Здесь вы передаете указатель myString по значению в функцию. А внутри функции присваиваете в копию указателя, а сам myString при этом остается неизменным. Т.е. это явно не то что вы хотели получить. Но на самом деле вам и не надо было менять сам указатель, вам надо было поменять строку, на которую он указывает. И тут мы уже спокойно можем работать с копией указателя, т.к. копия указывает на тот же буфер что и исходный указатель. Таким образом получаем такой код функции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Ну и для полноты картины надо сказать что кроме передачи "по значению", в С++ можно объявлять аргументы для передачи "по ссылке". Код: plaintext 1. 2. 3. 4. 5. 6. В С эквивалентный код можно было записать так: Код: plaintext 1. 2. 3. 4. 5. 6. Вы уже встречались с таким кодом когда делали односвязный список: Код: plaintext 1. 2. 3. 4. 5. 6. Так вот это был С-шный вариант, а в С++ такой код можно записать так: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2012, 03:04 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Спасибо огромное за расширенный ответ! Anatoly Moskovsky Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Здесь вы передаете указатель myString по значению в функцию. А внутри функции присваиваете в копию указателя, а сам myString при этом остается неизменным. Т.е. это явно не то что вы хотели получить. Тогда я могу преположить, что в коде ниже в обоих случаях указатель тоже передается по ссылке. Но так как копия указателя, которая создается в функциях f1 и f2 указывает на тот же адрес, что и оригинальный указатели из функции main , выводиться значение 10. Такое предположение верно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Я считал, или нам так объяснили, что в случае с передачей переменной по указателю, как и по ссылке, копия не создается. Но получается в случае с передачей по указателю создается копия не переменной, а указателя. Так? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 00:53 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_GТогда я могу преположить, что в коде ниже в обоих случаях указатель тоже передается по ссылке.Нет. Там копируется указатель, можно сказать что он передается по значению. MaximuS_G Но так как копия указателя, которая создается в функциях f1 и f2 указывает на тот же адрес, что и оригинальный указатели из функции main , выводиться значение 10. Такое предположение верно? Да. Хотя все же там "копии указателей" :) MaximuS_GЯ считал, или нам так объяснили, что в случае с передачей переменной по указателю, как и по ссылке, копия не создается. Но получается в случае с передачей по указателю создается копия не переменной, а указателя. Так?Да. Указатель это тоже переменная и он подчиняется всем законам обычных переменных. Он копируется при передаче в функцию и на него можно сделать указатель. Чтобы разобраться с указателями лучше всего нарисуй себе память в виде длинной ленты поделенной на ячейки. Каждая ячейка это один байт. Создаешь переменную или выделяешь память - помечай несколько последовательных ячеек на этой ленте. А теперь идем по твоей программе и рисуем: Где-то в памяти (не важно где) у тебя лежит переменная int v, пометь ее. Теперь ты заходишь в функцию f1 и у тебя автоматически создается переменная int *v, в ней будет лежать номер первой ячейки от первого v. Обратно в main(): ты где-то в памяти создаешь переменную int *vp, потом выделяешь еще один кусок памяти и записываешь в vp адрес перевого байта этого куска. Заходишь в f2() и у тебя автоматически создается еще одна переменная int *vp в которую копируется значание из переменной vp принадлежащей main(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 01:49 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
White Owl Спасибо большое за комментарии! White OwlMaximuS_GТогда я могу преположить, что в коде ниже в обоих случаях указатель тоже передается по ссылке. Нет. Там копируется указатель, можно сказать что он передается по значению. Тут я ошибся конечно когда писал, я имел ввиду по значению. Что Вы и подтвердили :) White OwlУказатель это тоже переменная и он подчиняется всем законам обычных переменных. Он копируется при передаче в функцию и на него можно сделать указатель. Ага, теперь лучше понятен пример с передачей указателя по указателю в односвязных списках. Тогда у меня появляется вопрос. Anatoly MoskovskyВот у вас был первоначально код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Здесь вы передаете указатель myString по значению в функцию. А внутри функции присваиваете в копию указателя, а сам myString при этом остается неизменным . Т.е. это явно не то что вы хотели получить. Но ведь здесь копия указателя указывает на тот же самый адрес, что и указатель myString, и значение в ячейках памяти должны остаться? Как в этом примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Я думаю здесь конечно вся хитрость в том (и что я не понимаю), что массив присваивается вот так Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 12:07 |
|
||
|
передача массива char между функциями
|
|||
|---|---|---|---|
|
#18+
MaximuS_GЯ думаю здесь конечно вся хитрость в том (и что я не понимаю), что массив присваивается вот так Код: plaintext 1. Это не присваивание массива. В С вообще нету такого понятия как присваивание массивов. Это задание нового значения для указателя. Вот в этом коде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. При вызове f1, в строке C , создается копия указателя mystring, и эта копия обозначается как v в строке A . А в строке B , в эту копию записывается новое значение: адрес строки "jh" лежащей в сегменте статических данных. До строки B значение v совпадает со значением myString, после - не совпадают. Но так-как v и myString это разные переменные, то и после выхода из f1() myString продолжает показывать на кусок памяти в сто байт выделенный на куче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2012, 19:30 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38055693&tid=2020637]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 275ms |
| total: | 559ms |

| 0 / 0 |
