переменное расположение в vs2010 - PullRequest
2 голосов
/ 15 декабря 2011

Код: // VS2010

int a;
int b;
int c;
int d;

int main(){
    //output the address of global variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
    //output the address of local variables
    printf("0x%x, 0x%x, 0x%x, 0x%x\n", &a2, &b2, &c2, &d2);
}

Вывод:

0x1197a44, 0x1197a3c, 0x1197a40, 0x1197a38
0x15fb00, 0x15faf4, 0x15fae8, 0x15fadc
0x15fad0, 0x15fac4, 0x15fab8, 0x15faac

Мой вопрос:

  1. Why are the global variables not stored in order?Приведенный выше вывод означает, что они вышли из строя.

  2. Why are the local varialbes not stored continuously?Приведенный выше вывод означает, что VS2010 вставляет 8-байтовое пространство между каждыми двумя из них.

Кто-нибудь может мне помочь?Большое спасибо!

--------------------------------------- дополнение------------------------------------------

Код:\ gcc версия 4.6.1 (Ubuntu / Linaro 4.6.1-9ubuntu3)

int a;
int b;
int c;
int d;

void main(){
        //output the address of global variables
    printf("%p, %p, %p, %p\n", &a, &b, &c, &d);

    int a1, b1, c1, d1;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a1, &b1, &c1, &d1);

    int a2 = 1;
    int b2 = 2; int c2; int d2 = 4;
        //output the address of local variables
    printf("%p, %p, %p, %p\n", &a2, &b2, &c2, &d2);
}

Вывод:

0x60103c, 0x601034, 0x601038, 0x601030
0x7fff126253a0, 0x7fff126253a4, 0x7fff126253a8, 0x7fff126253ac
0x7fff126253b0, 0x7fff126253b4, 0x7fff126253b8, 0x7fff126253bc

В gcc - адрес глобальной переменной и локальной переменнойявляется непрерывным и в порядке.

Так что я хочу знать, что и почему vs2010 делает это для нашего кода.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Ни одна из них не указана в спецификации, компилятор может делать то, что хочет.

Что касается локальных переменных, вы, вероятно, используете сборку DEBUG, и для проверки целостности стека вставляется заполнение. Если произойдет какое-либо переполнение памяти, заполнение будет перезаписано, и переполнение будет обнаружено.

0 голосов
/ 15 декабря 2011

Ваша программа имеет неопределенное поведение, потому что типы, указанные в строке формата, не совпадают с типами других аргументов, передаваемых printf.

Таким образом, ваш код не демонстрирует, что переменные не хранятся непрерывно.

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