Сколько памяти выделяет каждая строка кода? - PullRequest
1 голос
/ 22 мая 2011
char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};

На мой взгляд, вторая строка кода должна выделять 8 байт памяти, но правильный ответ - 16 байт.Почему?

Ответы [ 2 ]

5 голосов
/ 22 мая 2011

Это зависит от того, что вы подразумеваете под «выделить»;ни один из этих методов не выполняет динамическое распределение на основе кучи в смысле malloc().

Если вы имеете в виду «сколько места зарезервировано в стеке», тогда ответ для второй строки вполне может быть8, но зависит от вашей платформы и компилятора .Компилятор может решить выровнять все переменные стека, например, по 16-байтовым границам.

Конечно, для хранения строкового литерала "warning" потребуется, по крайней мере, 8 байтов статического программного пространства.инициализация str.Компилятор может быть достаточно умным, чтобы определить, что вы используете один и тот же строковый литерал в нескольких местах, или это может быть не так.Опять же, это зависит .

Единственное, что не зависит от компилятора, это то, что sizeof(str) всегда должно быть 8.

0 голосов
/ 22 мая 2011

что ты имеешь в виду?

$ cat mem.c 
#include <stdio.h>

int main() {
    char str[] = "warning";
    printf("%li\n", sizeof(str));
}

$ gcc mem.c 
$ ./a.out 
8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...