Это в стеке или куче? - PullRequest
       18

Это в стеке или куче?

5 голосов
/ 29 июня 2009

У меня есть некоторый C-код, который является чем-то вроде головоломки. По какой-то причине, связанной с этим кодом, мне интересно, как я могу определить, заканчивается ли struct объект в куче или стеке? Объекты не создаются с malloc или calloc. Они начинают свою жизнь в виде массива. Для целей этого поста я собираюсь назвать структуру Emp.

Emp myEmp[6];

/* Each myEmp[?] item is populated in code */

Объекты сортируются и обрабатываются различными способами, и в какой-то момент объекты копируются и затем передаются массиву-указателю. Копирование осуществляется через memcpy. Затем объекты помещаются в нечто вроде: Emp* emps_a[6].

Объекты берутся из копии и присваиваются вышеуказанному emps_a.

int i;
for( i = 0; i < n; i++ )
{
    emps_a[i] = myEmpsCopy + i;
}

Я не уверен, имеет ли какое-либо отношение это к моему вопросу. Мне никогда не нужно free () или очищать память ... Боюсь, я не слишком много знаю о C.

Помощь очень ценится.

1 Ответ

17 голосов
/ 29 июня 2009

Если оставить глобальные переменные и переменные, объявленные с модификатором static (которые размещены в отдельной области памяти), локальные переменные, объявленные в теле функции, размещаются в стеке, тогда как все, что вы вызываете malloc, выделяется в куча. Кроме того, массивы C99 переменного размера и память, выделенные с помощью _alloca, окажутся в стеке.

int* x[10];   // The addresses are held on the stack
int i;        // On the stack
for(i = 0; i < 10; ++i)
   x[i] = malloc(sizeof(int)*10);  // Allocates memory on the heap

Например, в приведенном выше коде в стеке содержится массив значений int*, содержащих адреса в 10 разных местах в куче.

...