LINUX.ORG.RU

Возвращаешь указатель на память, выделенную на стеке, которая может к моменту обращения к ней быть перетерта.

Deleted
()

Вы арестованы и обвиняетесь по минимум двум статьям.

arturpub ★★
()
Ответ на: комментарий от anonymous

вопрос не в этом вопрос в возврате указателя на локальный экземляр. Со строками вот так работает:

char * get()
{
   return "sdfsdfs";
}
someoneelsenotme
() автор топика

result на стеке создаётся → будет уничтожена при выходе из функции → ты возвращаешь указатель на «мусор», а память, выделенная malloc'ом, утекает в никуда.

theNamelessOne ★★★★★
()

Возвращать адрес локального объекта? По-моему хрень какая-то.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от someoneelsenotme

Прозреваю, что стока константа и ее адрес константа.

loz ★★★★★
()

TPair result;
return &result;

Вот здесь всё плохо. В остальном сойдёт.

a1batross ★★★★★
()
Ответ на: комментарий от someoneelsenotme

facepalm.c

Куда течёт? У строки static scope.

Deleted
()
Ответ на: комментарий от someoneelsenotme

Здесь нет malloc. Строковые литералы хранятся в статической области памяти, их не надо освобождать

anonymous
()
Ответ на: комментарий от someoneelsenotme

Если строка создается не на стеке - значит ее надо освобождать, разве не так?

Строка нигде не «создаётся», она присутствует в секции .data исполняемого файла.

Deleted
()
Ответ на: комментарий от someoneelsenotme

Строка уже есть. Есть вот ты попробуешь выводить указатель того, что вернёт get(), то получишь ровно одно и то же всегда.

Потому никаких free() здесь не нужно и ничто никуда не течёт.

a1batross ★★★★★
()

Если у нее static scope, как она вообще вылезает за пределы функции?

Если я на бумажке напишу «103274 Москва, Краснопресненская наб., д. 2, стр. 2» и привезу бумажку из Москвы во Владивосток, это значит, что правительство РФ «вылезло» вместе с бумажкой?

Deleted
()

Вот именно поэтому я считаю, что хотя бы поверхностное изучение ассемблера не такая уж и бесполезная штука в 2016 году.

mix_mix ★★★★★
()

Пять лет строгого режима.

Deleted
()
Ответ на: комментарий от mix_mix

Вот именно поэтому я считаю, что хотя бы поверхностное изучение ассемблера не такая уж и бесполезная штука в 2016 году.

Как человек, начинавший знакомство с программированием со справочника инструкций i8080, категорически поддерживаю.

Deleted
()

text, data, bss, stack, heap. мне кажется, тебе стоит внимательно почитать о сегментах данных, глядишь и вопрос отпадёт сам собой

jtootf ★★★★★
()

Нелегально. Приговор - бан на ЛОРе.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от someoneelsenotme

Выше ссылка на статью про сегменты памяти норм, весь ассемблер тебе врятли нужен.

loz ★★★★★
()

Нельзя возвращать указатель на стек. Строки аллоцируются статически в секции ".rodata" (или аналогичной - зависит от платформы). Короче, RTFM.

Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Лучше уж тогда возвращать by value.

Deleted
()
Ответ на: комментарий от Deleted

Нельзя возвращать указатель на стек

Возвращать можно, это просто адрес. Что потом предполагается делать с этим адресом уже другой вопрос.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Тогда ТС не задавал бы таких вопросов.

WRG ★★★★
()

Раньше пришлось бы долго и упорно объяснять, теперь значительно проще: включи санитайзер, он тебе в нескучной цветовой гамме объяснит что у тебя не так.

Macil ★★★★★
()
Ответ на: комментарий от someoneelsenotme

вопрос в возврате указателя на локальный экземляр

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

unt1tled ★★★★
()
Ответ на: комментарий от kirk_johnson

Это в данном случае. Но не в целом верно для «указателя на переменную на стеке». Будь оно ниже функции в стеке, что в этом плохого?

Esteban_Garcia
()
Ответ на: комментарий от Esteban_Garcia

Это в данном случае. Но не в целом верно для «указателя на переменную на стеке». Будь оно ниже функции в стеке, что в этом плохого?

Ниже - ничего. Мы же про выше :)

kirk_johnson ★☆
()

Если компилятор заинлайнит - может и прокатит. А так - беда.

RazrFalcon ★★★★★
()
Ответ на: комментарий от kirk_johnson

Вообще да. Потому что это указатель на память, в которой непонятно что.

Вот вам указатель на переменную в стеке. Какие с ним у вас проблемы?

void foo()
{
   int value = 0;
   const int* p = &value;
   printf("%p: %d\n", p, *p);
}

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.