Модераторы: 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   Вверх
admsasha
Дата 24.4.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(chipset @ 25.4.2005, 00:03)
Данные то она отдает разные но значение указателя одинаковое, ибо static char.

так я не понял, p и pp одинаковые значение имеет или нет ?

Цитата(chipset @ 25.4.2005, 00:03)
Тогда нафига тебе вообще что-то возвращать?

что бы получить результат, только в одну переменную не во всех переменных которые вызывали эту функцию
PM MAIL WWW ICQ Jabber   Вверх
chipset
Дата 24.4.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(admsasha @ 24.4.2005, 07:07)
так я не понял, p и pp одинаковые значение имеет или нет ?

Да. Потому что ты возвращаешь значение указателя а оно у тебя одинаковое всё время, static оно..

Цитата(admsasha @ 24.4.2005, 07:07)
что бы получить результат, только в одну переменную не во всех переменных которые вызывали эту функцию

Fire-plug уже ответил тогда 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   Вверх
admsasha
Дата 24.4.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bel_nikita @ 17.4.2005, 22:59)
char *proba(void){
    char* tmp = new char[2048];
    strcpy(tmp,"reer");
    return tmp;
}


при этом, будет каждый вызов будет независемый ?
т.е. каждый char[100]=proba(); будет получать свои данные, и не менять даже при выдачи функцией разные данные ?
PM MAIL WWW ICQ Jabber   Вверх
chipset
Дата 24.4.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вроде бы да 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   Вверх
admsasha
Дата 24.4.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну всё, всем спасибо... сознаюсь что не доконца все понял, но буду делать так как написал, мож дойдет когда либо...

рад что есть форумы, где можно получить ответ на заданный вопрос, а не получить мат в свою стороны, за его использование smile
PM MAIL WWW ICQ Jabber   Вверх
chipset
Дата 24.4.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что собственно непонятного? 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   Вверх
maxim1000
Дата 24.4.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



кстати, совсем забыл
есть еще такой метод:
Код

char *func(int n)
{
  static char result[100];
  if(n==0)
    return "qqq";
  else
    return "www";
}

smile
не буду нарушать традицию - у него тоже есть недостаток smile
вот такое лучше не писать:
Код

char *p;
p=func(0);
p[1]='a';//лучше не писать именно вот эту строчку

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


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


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(maxim1000 @ 24.4.2005, 22:32)
но если результат функции нужен только для чтения - самый простой способ smile

Так почему же тогда просто не объявить ее с сигнатурой const char*, чтобы избежать такой ситуации? smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
maxim1000
Дата 25.4.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Так почему же тогда просто не объявить ее с сигнатурой const char*, чтобы избежать такой ситуации?

просто изначально в вопросе был пример без модификатора const


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


Шустрый
*


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

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



Все обсуждения даной темы не имеют смысла, покуда задавший вопрос не поймет, что ему собственно нужно, т.к. создается впечатление, что все вышеприведенные рекомендации лично автора вопроса не удовлетворили.
Цитата(admsasha @ 24.4.2005, 17:23)
при этом, будет каждый вызов будет независемый ?
т.е. каждый char[100]=proba(); будет получать свои данные, и не менять даже при выдачи функцией разные данные ?

Кто-то может дать определение, что такое "независимый вызов"?
ЗЫ: Фраза явно напрашивается, чтобы ее передали С.Альтову (или М.Задорнову, или А.Иванову) для
размешения в рубрике "Что бы это значило".
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 26.4.2005, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Разьясняю.
Цитата(Fire @ 25.4.2005, 19:28)
Кто-то может дать определение, что такое "независимый вызов"?

Это обозначает то что значение последующих вызовов не будет зависимо от предыдущих.
smile
Цитата(Fire @ 25.4.2005, 19:28)
Все обсуждения даной темы не имеют смысла, покуда задавший вопрос не поймет, что ему собственно нужно, т.к. создается впечатление, что все вышеприведенные рекомендации лично автора вопроса не удовлетворили.

Уважаемый, если вы не поняли вопроса - это не значит что люди не имеют права обсуждать то что им интересно.

Цитата(Fire @ 25.4.2005, 19:28)
ЗЫ: Фраза явно напрашивается, чтобы ее передали С.Альтову (или М.Задорнову, или А.Иванову) для
размешения в рубрике "Что бы это значило".

Надо будет ему сообщить.



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 2.5.2005, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(chipset @ 26.4.2005, 05:49)
Разьясняю.

Цитата (Fire-Plug @ 25.4.2005, 19:28)
Кто-то может дать определение, что такое "независимый вызов"?


Это обозначает то что значение последующих вызовов не будет зависимо от предыдущих.

Не люблю примитивной отсебятины.
Для интереса попробуй найти аналогию своему "определению" хотя бы на И-нете. А также найти пример "зависимых вызовов ф-ций".
Возьмем, любую ф-цию, ну, например, CRTL ф-цию strlen(). В каком случае результат ее вызова будет зависеть от предыдущих вызовов, а в каких нет?
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 2.5.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fire @ 1.5.2005, 21:24)
А также найти пример "зависимых вызовов ф-ций".

Рекомендую прочитать ещё раз тему.
Код

int func()
{
static int i = 0;
i++;
return i;
}



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
admsasha
Дата 2.5.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fire @ 2.5.2005, 14:24)
также найти пример "зависимых вызовов ф-ций".

strtok, следующие результаты, могут зависеть, от предыдущих
PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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