Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > address of local variable


Автор: admsasha 17.4.2005, 15:44
есть код
Код

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

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

Автор: bel_nikita 17.4.2005, 15:59
Так нельзя!
Вот, так можно, но потом не забыть delete
Код

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

Автор: admsasha 17.4.2005, 17:01
Цитата
Вот, так можно, но потом не забыть delete


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

Код

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


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


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

Автор: maxim1000 19.4.2005, 11: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, а значит, указывать они будут на одну и ту же строку...

Автор: GrayCardinal 21.4.2005, 15:20
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 в раздельчик - Си для чайников.

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





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

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

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

А вообще, тебе следовало бы еще раз обратиться к определениям понятий о видимости и времени жизни переменных различных классов памяти в С/С++.

Автор: admsasha 24.4.2005, 16:59
Цитата(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];

Автор: chipset 24.4.2005, 17:03
Цитата(admsasha @ 24.4.2005, 06:59)

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

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

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

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

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

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

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

что бы получить результат, только в одну переменную не во всех переменных которые вызывали эту функцию

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

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

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

Fire-plug уже http://forum.vingrad.ru/index.php?showtopic=48984&view=findpost&p=388842 тогда smile

Автор: admsasha 24.4.2005, 17:23
Цитата(bel_nikita @ 17.4.2005, 22:59)
char *proba(void){
    char* tmp = new char[2048];
    strcpy(tmp,"reer");
    return tmp;
}


при этом, будет каждый вызов будет независемый ?
т.е. каждый char[100]=proba(); будет получать свои данные, и не менять даже при выдачи функцией разные данные ?

Автор: chipset 24.4.2005, 17:29
Вроде бы да smile

Автор: admsasha 24.4.2005, 18:08
ну всё, всем спасибо... сознаюсь что не доконца все понял, но буду делать так как написал, мож дойдет когда либо...

рад что есть форумы, где можно получить ответ на заданный вопрос, а не получить мат в свою стороны, за его использование smile

Автор: chipset 24.4.2005, 18:14
А что собственно непонятного? smile
Так как ты написал в самом начале - память выделяется на стеке функции, это значит что переменная самоуничтожится при выходе из области - конце функции.
Так как написали - память выделяется из кучи, что означает то, что память не уничтожится пока ты явно это не сделаешь.

Автор: maxim1000 24.4.2005, 20:32
кстати, совсем забыл
есть еще такой метод:
Код

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

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

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

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

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

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

Кто-то может дать определение, что такое "независимый вызов"?
ЗЫ: Фраза явно напрашивается, чтобы ее передали С.Альтову (или М.Задорнову, или А.Иванову) для
размешения в рубрике "Что бы это значило".

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

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

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

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

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

Автор: Fire-Plug 2.5.2005, 07:24
Цитата(chipset @ 26.4.2005, 05:49)
Разьясняю.

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


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

Не люблю примитивной отсебятины.
Для интереса попробуй найти аналогию своему "определению" хотя бы на И-нете. А также найти пример "зависимых вызовов ф-ций".
Возьмем, любую ф-цию, ну, например, CRTL ф-цию strlen(). В каком случае результат ее вызова будет зависеть от предыдущих вызовов, а в каких нет?

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

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

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

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

strtok, следующие результаты, могут зависеть, от предыдущих

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)