2013-10-07 3 views
1

Предположим, у меня есть эти переменные и указатели. Как определить, что находится в стеке или куче?Определение переменных стека или кучи в C?

 #include <stdio.h> 
    #define SIZE 5 


    int main(void) { 

    int *zLkr;     
    int *aLkr= NULL; 
    void *sLkr= NULL; 
    int num, k; 
    int a[SIZE] = { 1, 2, 3, 4, 5 }; 
    zLkr = a; 

    } 
+1

Поскольку динамического распределения нет, вопрос в том, являются ли эти переменные объявленными в теле функции или в файловой/глобальной области? – jxh

+0

код был изменен, чтобы иметь смысл – answerSeeker

+0

Любопытный, какой у вас прецедент? –

ответ

1

Все ваши переменные имеют автоматическую область действия. Они исходят из «стека», поскольку переменные перестают действовать после возвращения функции.

Именованные функциональные переменные никогда не могут исходить из «кучи» в том смысле, что вы имеете в виду. Память для именованной функциональной переменной всегда привязана к области функций (или самой внутренней области блока внутри функции, в которой объявлена ​​переменная).

Переменной может быть присвоено значение, полученное malloc() или аналогичная функция динамического распределения. Затем переменная указывает на объект, который существует в «куче». Однако, указанная переменная указателя сама по себе равна не в «куче».

Иногда сам «стек» динамически выделяется. Например, для потока. Затем память, используемая для выделения локальных переменных функции, работающих внутри этого потока, находится в «куче». Однако сами переменные все еще автоматические, поскольку они недействительны после возвращения функции.

+0

Если бы у меня было 'num = * zLkr [2];' в функции значение было бы 3, но все равно было бы в стеке? – answerSeeker

+0

'num' находится в стеке. '* zLkr [2]' является недопустимым выражением. 'zLkr' указывает на' & a [0] '. 'a' находится в« стеке ». – jxh

+0

, так что это должно быть 'num = & zLkr [2];' поэтому тогда значение все равно будет 0? и он все равно будет в стеке? – answerSeeker

1

Локальные переменные размещаются на стеке

int main(void) 
{  
    int thisVariableIsOnTheStack; 

    return 0; 
} 

Переменные из кучи выделены с помощью таНос где-то в памяти. Эта память может быть возвращена в кучу и повторно использована более поздним вызовом malloc.

int main(void) 
{ 
    char *thisVariableIsOnTheHeap = (char *) malloc(100); 

    free (thisVariableIsOnTheHeap); 
    return 0; 
} 

Переменные модуля также не являются. Они имеют постоянный адрес в памяти в одном модуле.

void f1(void) 
{ 
    /* This function doesn't see thisIsAModule */ 
} 

int thisIsaModule = 3; 

void f(void) 
{ 
    thisIsaModule *= 2; 
} 

int main(void) 
{ 
    return thisIsaModule; 
} 

Глобальные переменные не являются ни тем, ни другим. Они имеют постоянное значение в памяти, но могут передаваться по всем модулям.

extern int globalVariable; /* This is set in some other module. */ 

int main(void) 
{ 
    return globalVariable; 
} 
+0

Без malloc переменные всегда находятся в стеке? если они не глобальны? – answerSeeker

+0

Да. globals обычно заканчиваются в сегменте данных в памяти, который не является частью кучи или стека – EvilTeach

Смежные вопросы