LINUX.ORG.RU

[C] Выделение памяти.

 


0

0

Здравствуй, ЛОР. У меня вопрос немного нубский поэтому сильно ногами не бейте. Есть такая программа.

int main() {
         char *s=NULL;
         s=mkw();
         printf("%s\n");
         return 0;
}

char *mkw(void) {
     return "Hzzz";
}

Программа напечатает строчку «Hzzz».

Как в этой программе выделяется память для строчки «Hzzz» ?


Я полный профан в компиляторах, но вполне возможно что-то вроде:

static const char __internalCompilerString00001[] = "Hzzz";

char *mkw(void) {
    return (char*) internalCompilerString00001;
}

lester ★★★★
()

Возможно, для строковых констант память выделяется на куче. Если valgrind на такой код не ругается значит так и есть. Короче, смотри K&R

true_admin ★★★★★
()

Это данные, память выделяется при компиляции.
mkw только указатель на нее возвращает.

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

>У эта константа нашлась в секции .rodata.

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

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

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

да нет. просто попытка модификации литеральной строки - UB. В случае gcc он просто помещает такие строки в rodata без лишней возни.

alex_custov ★★★★★
()

1. Эта программа ничего не напечатает.

printf("%s\n"); поменять на printf("%s\n", s);

2. Строковые литералы - это по сути статические константы и размещаются в статическом сегменте данных.

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

#include <stdio.h>

static char *mkw(void)
{
return "xyz";
}

int main(void)
{
char *s = NULL;
s = mkw();
printf("%s\n", s);

return 0;
}

Почему splint ругается на этот код:

Splint 3.1.1 --- 11 Sep 2006

a.c: (in function mkw)
a.c:5:9: Observer storage returned without qualification: "xyz"
Observer storage is transferred to a non-observer reference. (Use
-observertrans to inhibit warning)
a.c:5:9: Storage becomes observer
a.c: (in function main)
a.c:14:11: Fresh storage s not released before return
A memory leak has been detected. Storage allocated locally is not released
before the last reference to it is lost. (Use -mustfreefresh to inhibit
warning)
a.c:11:2: Fresh storage s created

Finished checking --- 2 code warnings

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

Ой, какой умный компиялтор пошел.

1. "hhh" - это const char* если быть точный. То есть писаться по этому указателю нельзя. А ты его преобразовал к обычному char* 2. Потом ты отдал эту строку на вход sscanf. Что он с ней должне делать? Сколько байт в нее можно писать? вопросов много, а ничего из этого ты сомпилятору не объяснил

namezys ★★★★
()

лучше так не делать. а именно

так: "s=mkw();"

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