| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > address of local variable |
| Автор: admsasha 17.4.2005, 15:44 | ||||
есть код
компиляция удачно проходит, но выдается:
что нужно сделать что бы это исправить ? как правильно написать данную функцию ? |
| Автор: bel_nikita 17.4.2005, 15:59 | ||
| Так нельзя! Вот, так можно, но потом не забыть delete
|
| Автор: admsasha 17.4.2005, 17:01 | ||
delete где должна стоять ? |
| Автор: Artiom 17.4.2005, 18:17 |
| Надо передовать строку как параметр через указатель. Какой тебе толк в адресе локальной переменной? |
| Автор: admsasha 17.4.2005, 18:36 |
| мне надо просто вывод результата функции... и больше нечего per1=proba(); |
| Автор: bilbobagginz 18.4.2005, 14:52 |
| "просто вывод" замешивает аллокацию памяти. если хочешь правильней делать, то аллоцируй над функцией, и передавай указатель. функция в него чего-нить впишет. вообще, старайся не скрывать аллокацию памяти, потом легче жить будет. добавляю файл... посмотри. |
| Автор: maxim1000 18.4.2005, 15:02 |
| есть еще один вариант дописать static к объявлению локальной переменной получится нечто вроде глобальной переменной, только видно ее будет только из функции есть недостаток при каждом вызове функции старое значение будет стираться если приведенный пример полностью отображает ситуацию - можно использовать если реально поведение функции будет сложнее, тогда надо будет это учитывать... |
| Автор: admsasha 19.4.2005, 07:48 | ||
| А мне и не надо, что бы сохранялось старое значение... даже наоборот нужно что бы новое писалось ! Или я неправильно это понимаю ?? вот допустим функция rnds
код так просто набрал... т.е. мне не надо что бы при использовании кокой либо части программы менялось первое значенение... |
| Автор: maxim1000 19.4.2005, 11:29 | ||
я имел в виду такое:
после таких операций p будет равно pp, а значит, указывать они будут на одну и ту же строку... |
| Автор: GrayCardinal 21.4.2005, 15:20 | ||||||||
| admsasha Извини, тебя кто учил программить на Си ? Руки тому поотрывать
Нельзя возвращать указатель на переменную, которая у тебя лежит в стэке функции. При выходе из функции не факт что стэк не затрется (об этом и предупреждение компилятора. Там надо например
Добавлено @ 15:21
и часто ты так извращаешься ? Добавлено @ 15:23
По-моему человеку в FAQ в раздельчик - Си для чайников. |
| Автор: bilbobagginz 21.4.2005, 17:39 |
| тов. Кардинал... тебя самого на Си блин кто new писать учил ? в Си нету "new" и "delete", есть malloc(),calloc(), realloc(), brk(),sbrk() и free(). |
| Автор: GrayCardinal 22.4.2005, 15:44 |
| bilbobagginz Не надо, я в курсе. Но по сравнению с тем, что ему предложили... ЗЫ И не надо сокращать мой творческий псевдоним. Добавлено @ 15:45 ЗЫЫ, а вообще я и daemon () знаю, меж прочим |
| Автор: Fire-Plug 23.4.2005, 05:19 |
| admsasha Неплохо было бы четко сформулировать, что должно в принципе происходить в твоей ф-ции. Если нужно, чтобы ф-ция возвращала char *, то все возможные решения тебе уже были предложены, а именно, 1) вернуть указатель на динамич. массив, созданный в теле ф-ции (bel_nikita). 2) вернуть указатель на статич. массив, объявленный в теле ф-ции (maxim1000). 3) вернуть указатель на локальный массив, объявленный вне тела ф-ции, к-рый передается в ф-цию как параметр (Artiom). А вообще, тебе следовало бы еще раз обратиться к определениям понятий о видимости и времени жизни переменных различных классов памяти в С/С++. |
| Автор: admsasha 24.4.2005, 16:59 | ||||
т.е. если функция отдает каждый раз разные данные, то p и pp будут меняться ???? т.е. всегда иметь одно и тоже значение ? Вот как раз мне это и не надо ! мне надо что по нормальному все делалось {как же я не навижу все эти ссылки}... т.е. каждый вызов нечего не менял нигде, а записывал результат в char[100]; |
| Автор: chipset 24.4.2005, 17:03 | ||||
Данные то она отдает разные но значение указателя одинаковое, ибо static char. Добавлено @ 17:04
Тогда нафига тебе вообще что-то возвращать? |
| Автор: admsasha 24.4.2005, 17:07 | ||||
так я не понял, p и pp одинаковые значение имеет или нет ?
что бы получить результат, только в одну переменную не во всех переменных которые вызывали эту функцию |
| Автор: chipset 24.4.2005, 17:16 | ||||
Да. Потому что ты возвращаешь значение указателя а оно у тебя одинаковое всё время, static оно..
Fire-plug уже http://forum.vingrad.ru/index.php?showtopic=48984&view=findpost&p=388842 тогда |
| Автор: admsasha 24.4.2005, 17:23 | ||
при этом, будет каждый вызов будет независемый ? т.е. каждый char[100]=proba(); будет получать свои данные, и не менять даже при выдачи функцией разные данные ? |
| Автор: chipset 24.4.2005, 17:29 |
| Вроде бы да |
| Автор: admsasha 24.4.2005, 18:08 |
| ну всё, всем спасибо... сознаюсь что не доконца все понял, но буду делать так как написал, мож дойдет когда либо... рад что есть форумы, где можно получить ответ на заданный вопрос, а не получить мат в свою стороны, за его использование |
| Автор: chipset 24.4.2005, 18:14 |
| А что собственно непонятного? Так как ты написал в самом начале - память выделяется на стеке функции, это значит что переменная самоуничтожится при выходе из области - конце функции. Так как написали - память выделяется из кучи, что означает то, что память не уничтожится пока ты явно это не сделаешь. |
| Автор: maxim1000 24.4.2005, 20:32 | ||||
| кстати, совсем забыл есть еще такой метод:
не буду нарушать традицию - у него тоже есть недостаток вот такое лучше не писать:
т.к. строки, которые пишутся в тексте программы в кавычках, компилятор автоматически записывает в отдельную область памяти, в которую лучше не писать но если результат функции нужен только для чтения - самый простой способ |
| Автор: Void 25.4.2005, 19:08 | ||
Так почему же тогда просто не объявить ее с сигнатурой const char*, чтобы избежать такой ситуации? |
| Автор: maxim1000 25.4.2005, 23:05 | ||
просто изначально в вопросе был пример без модификатора const |
| Автор: Fire-Plug 26.4.2005, 05:28 | ||
Все обсуждения даной темы не имеют смысла, покуда задавший вопрос не поймет, что ему собственно нужно, т.к. создается впечатление, что все вышеприведенные рекомендации лично автора вопроса не удовлетворили.
Кто-то может дать определение, что такое "независимый вызов"? ЗЫ: Фраза явно напрашивается, чтобы ее передали С.Альтову (или М.Задорнову, или А.Иванову) для размешения в рубрике "Что бы это значило". |
| Автор: chipset 26.4.2005, 05:49 | ||||||
Разьясняю.
Это обозначает то что значение последующих вызовов не будет зависимо от предыдущих.
Уважаемый, если вы не поняли вопроса - это не значит что люди не имеют права обсуждать то что им интересно.
Надо будет ему сообщить. |
| Автор: Fire-Plug 2.5.2005, 07:24 | ||
Не люблю примитивной отсебятины. Для интереса попробуй найти аналогию своему "определению" хотя бы на И-нете. А также найти пример "зависимых вызовов ф-ций". Возьмем, любую ф-цию, ну, например, CRTL ф-цию strlen(). В каком случае результат ее вызова будет зависеть от предыдущих вызовов, а в каких нет? |
| Автор: chipset 2.5.2005, 14:29 | ||||
Рекомендую прочитать ещё раз тему.
|
| Автор: admsasha 2.5.2005, 15:28 | ||
strtok, следующие результаты, могут зависеть, от предыдущих |