Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> address of local variable, как избежать address of local variable ? 
:(
    Опции темы
admsasha
Дата 17.4.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



есть код
Код

char *proba(void){
    char tmp[2048];
    strcpy(tmp,"reer");
    return tmp;
}


компиляция удачно проходит, но выдается:
Цитата
public.c: In function `char* proba()':
public.c:280: warning: address of local variable `tmp' returned

что нужно сделать что бы это исправить ?
как правильно написать данную функцию ?

PM MAIL WWW ICQ Jabber   Вверх
bel_nikita
Дата 17.4.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Так нельзя!
Вот, так можно, но потом не забыть delete
Код

char *proba(void){
    char* tmp = new char[2048];
    strcpy(tmp,"reer");
    return tmp;
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
admsasha
Дата 17.4.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата
Вот, так можно, но потом не забыть delete


delete где должна стоять ?
PM MAIL WWW ICQ Jabber   Вверх
Artiom
Дата 17.4.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Надо передовать строку как параметр через указатель. Какой тебе толк в адресе локальной переменной?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
admsasha
Дата 17.4.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



мне надо просто вывод результата функции... и больше нечего

per1=proba();
PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 18.4.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



"просто вывод" замешивает аллокацию памяти.
если хочешь правильней делать, то аллоцируй над функцией, и передавай указатель.
функция в него чего-нить впишет.
вообще, старайся не скрывать аллокацию памяти, потом легче жить будет.

добавляю файл... посмотри.

Это сообщение отредактировал(а) bilbobagginz - 18.4.2005, 14:59

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  testing.txt


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
maxim1000
Дата 18.4.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



есть еще один вариант
дописать static к объявлению локальной переменной
получится нечто вроде глобальной переменной, только видно ее будет только из функции
есть недостаток
при каждом вызове функции старое значение будет стираться
если приведенный пример полностью отображает ситуацию - можно использовать
если реально поведение функции будет сложнее, тогда надо будет это учитывать...


--------------------
qqq
PM WWW   Вверх
admsasha
Дата 19.4.2005, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



А мне и не надо, что бы сохранялось старое значение... даже наоборот нужно что бы новое писалось !

Или я неправильно это понимаю ??

вот допустим функция rnds

Код

char *rnd(void){
    char* rnd = new char[2048];
    // какие то операции с ней
    strcpy(tmp,"5439023");
    return tmp;
}


код так просто набрал...


т.е. мне не надо что бы при использовании кокой либо части программы менялось первое значенение...

Это сообщение отредактировал(а) admsasha - 19.4.2005, 08:11
PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 19.4.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



я имел в виду такое:
Код

char *func(int n)
{
  static char result[100];
  if(n==0)
    strcpy(result,"qqq");
  else
    strcpy(result,"www");
  return result;
}
...
{
  char *p,*pp;
  p=func(0);
  pp=func(1);
}

после таких операций p будет равно pp, а значит, указывать они будут на одну и ту же строку...


--------------------
qqq
PM WWW   Вверх
GrayCardinal
Дата 21.4.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



admsasha
Извини, тебя кто учил программить на Си ? Руки тому поотрывать smile

Цитата

har *proba(void){
    char tmp[2048];
    strcpy(tmp,"reer");
    return tmp;
}

Нельзя возвращать указатель на переменную, которая у тебя лежит в стэке функции. При выходе из функции не факт что стэк не затрется (об этом и предупреждение компилятора.

Там надо например
Цитата

char * tmp;
tmp = new char[2048]


Добавлено @ 15:21
Цитата
получится нечто вроде глобальной переменной, только видно ее будет только из функции

и часто ты так извращаешься ?
Добавлено @ 15:23
Цитата
delete где должна стоять ?

По-моему человеку в FAQ в раздельчик - Си для чайников.

Это сообщение отредактировал(а) GrayCardinal - 21.4.2005, 15:24


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 21.4.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



тов. Кардинал... тебя самого на Си блин кто new писать учил ?
smile
в Си нету "new" и "delete",
есть malloc(),calloc(), realloc(), brk(),sbrk() и free().







--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 22.4.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



bilbobagginz
Не надо, я в курсе. Но по сравнению с тем, что ему предложили... smile А "new" это у меня так, нервное smile

ЗЫ
И не надо сокращать мой творческий псевдоним.
Добавлено @ 15:45
ЗЫЫ,
а вообще я и daemon () знаю, меж прочим smile



--------------------
PM MAIL WWW   Вверх
Fire-Plug
Дата 23.4.2005, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



admsasha
Неплохо было бы четко сформулировать, что должно в принципе происходить в твоей ф-ции.
Если нужно, чтобы ф-ция возвращала char *, то все возможные решения тебе уже были предложены, а именно,
1) вернуть указатель на динамич. массив, созданный в теле ф-ции (bel_nikita).
2) вернуть указатель на статич. массив, объявленный в теле ф-ции (maxim1000).
3) вернуть указатель на локальный массив, объявленный вне тела ф-ции, к-рый передается в ф-цию как параметр (Artiom).

А вообще, тебе следовало бы еще раз обратиться к определениям понятий о видимости и времени жизни переменных различных классов памяти в С/С++.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
admsasha
Дата 24.4.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(maxim1000 @ 19.4.2005, 18:29)
я имел в виду такое:
Код

char *func(int n)
{
  static char result[100];
  if(n==0)
    strcpy(result,"qqq");
  else
    strcpy(result,"www");
  return result;
}
...
{
  char *p,*pp;
  p=func(0);
  pp=func(1);
}

после таких операций p будет равно pp, а значит, указывать они будут на одну и ту же строку...

т.е. если функция отдает каждый раз разные данные, то p и pp будут меняться ????
т.е. всегда иметь одно и тоже значение ?
Вот как раз мне это и не надо !
мне надо что по нормальному все делалось {как же я не навижу все эти ссылки}... т.е. каждый вызов нечего не менял нигде, а записывал результат в char[100];

Это сообщение отредактировал(а) admsasha - 24.4.2005, 17:00
PM MAIL WWW ICQ Jabber   Вверх
chipset
Дата 24.4.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Цитата(admsasha @ 24.4.2005, 06:59)

т.е. если функция отдает каждый раз разные данные, то p и pp будут меняться ????
т.е. всегда иметь одно и тоже значение ?
Вот как раз мне это и не надо !

Данные то она отдает разные но значение указателя одинаковое, ибо static char.
Добавлено @ 17:04
Цитата(admsasha @ 24.4.2005, 06:59)

мне надо что по нормальному все делалось {как же я не навижу все эти ссылки}... т.е. каждый вызов нечего не менял нигде, а записывал результат в char[100];

Тогда нафига тебе вообще что-то возвращать?
smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.