Аргумент функции и адреса переменных в C - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующая программа:

#include <stdio.h>

void func(char *str) {

   int a = 4;   

   printf("\n str Address: 0x%8X\n", (unsigned int)&str);
   printf("\n a Address: 0x%8X\n", (unsigned int)&a);
}

void main()
{
    char c = 'y';
    func(&c);
}

Когда я запускаю программу, я получаю следующий результат:

str Address: 0x43570EB8

a Address: 0x43570ECC

Насколько я понимаю, стек в Linux растет с высокойадрес по низкому адресу.Также str в качестве аргумента будет помещен первым в стек.Если это так, почему адрес str ниже, чем адрес для переменной a?Я неправильно печатаю адреса?

1 Ответ

0 голосов
/ 08 октября 2018

Скорее всего, параметр str передается в регистр.Обычно он будет использоваться из этого регистра и никогда не будет существовать в стеке.Поскольку ваш код принимает адрес str, компилятор вынужден поместить его в память где-нибудь, чтобы он мог предоставить адрес.Похоже, что компилятор сначала создал пространство для a в стеке (или, по крайней мере, по более высокому адресу), а затем создал пространство для str в стеке и скопировал значение из регистра в расположение стека.

Не следует ожидать, что проверка адресов объектов выявляет или отражает другие аспекты платформы, такие как ее двоичный интерфейс приложения (который, помимо прочего, определяет, как передаются параметры функции) или как управляется стек.Реализация AC может свободно перестраивать вещи, пока получающаяся программа достигает того же наблюдаемого поведения , как определено стандартом C, и современные реализации C могут выполнять большие и неожиданные преобразования при оптимизации программ.Наблюдаемое поведение включает определенные выходные данные программы, но не включает никаких правил упорядочения адресов объектов.

Кстати, в отношении вашего последнего вопроса, да, вы печатаете адреса неправильно.Чтобы напечатать адрес, приведите его к void * и напечатайте его с %p, а не %X.

...