В C, массив структуры выделяется в стеке? - PullRequest
0 голосов
/ 22 июня 2010

Я думаю, что это может быть очень глупый вопрос, но я просто хочу уточнить.Заранее спасибо!Я не уверен, что массив структуры, объявленный как локальная переменная внутри функции, размещается в стеке.Не правда ли?

Ответы [ 4 ]

7 голосов
/ 22 июня 2010

Это делает; все, что вы объявляете без выделения себя (например, путем вызова malloc) или объявления статики (как Фернандо говорит ), выделяется в стеке. Структуры - это просто способ группировки нескольких переменных; они по-прежнему имеют фиксированный размер (общий размер их элементов, возможно, плюс некоторые отступы), и доступ к полю структуры просто означает получение соответствующих байтов изнутри структуры

1 голос
/ 22 июня 2010

Если вы не используете malloc () (как сказал @Michael Mrozek) или не объявляете его с модификатором "static", он размещается в стеке.

1 голос
/ 22 июня 2010

Да, массив, объявленный в области действия функции как автоматическая переменная, будет выделен из стека. Вы хотите быть осторожными при этом, так как вы никогда не можете быть уверены в вызывающем контексте, будет ли достаточно стекового пространства для успеха. Хотя Windows по умолчанию создает стеки размером 1 МБ для потоков, а Linux по умолчанию создает стеки размером 8 МБ, вы все равно можете столкнуться с проблемой при создании больших массивов структур. В некоторых операционных системах стек потоков может составлять всего несколько килобайт.

Я склонен ограничивать автоматические переменные области действия функции простыми скалярными типами и помещать в кучу большие абстрактные типы и массивы.

0 голосов
/ 22 июня 2010

Это как другая переменная:

void function()
{

    struct my_struct a; // in the stack;
    struct my_struct *b = malloc(sizeof(struct my_strcut)); // not in the stack;
    static struct my_struct c; // not in the stack;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...