Я пытаюсь понять, как C выделяет память в стеке. Я всегда думал, что переменные в стеке могут быть изображены как переменные-члены structs, они занимают последовательный, смежный блок байтов в стеке. Чтобы помочь проиллюстрировать эту проблему, я где-то нашел, я создал эту небольшую программу, которая воспроизводила это явление.Сохраняются ли переменные стека C в обратном порядке?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function(int *i) {
int *_prev_int = (int *) ((long unsigned int) i - sizeof(int)) ;
printf("%d\n", *_prev_int);
}
void main(void)
{
int x = 152;
int y = 234;
function(&y);
}
Посмотрите, что я делаю? Предположим, что sizeof(int)
- это 4: Я просматриваю 4 байта за пройденным указателем, так как это будет читать 4 байта, прежде чем int y
в стеке вызывающего абонента.
Это не печать 152. Как ни странно, когда я смотрю на следующие 4 байта:
int *_prev_int = (int *) ((long unsigned int) i + sizeof(int)) ;
и теперь он работает, печатает все, что в x
внутри стека вызывающего абонента. Почему x
имеет более низкий адрес, чем y
? Перегружены ли переменные стека вверх дном?
стек хранится вниз – Ajit
Я думаю, что это реализация определена/или неуказана. Проверьте этот ответ http://stackoverflow.com/a/4105123/1673391 –
Это полностью зависит от платформы, но многие основные платформы фактически увеличивают кучу вверх от раздела кода/данных и стека вниз от вершины (доступно) Память. Вы должны ** никогда не полагаться на это на свой код C, хотя ... – DevSolar