Что-то про указатели и адреса - PullRequest
0 голосов
/ 04 декабря 2011

Я немного озадачен результатом этого кода:

#include <stdio.h>
#include <stdlib.h>

int char_address(char *myChar)
{
        printf("IN FUNCTION ADRESS = %p\n", &myChar);
        return 0;
}

int main(int argc, char **argv)
{
        char *string;

        string = (char *)malloc(32 * sizeof(char));

        printf("IN MAIN ADDRESS = %p\n", &string);
        char_address(string);
        return 0;
}

Вывод:

IN MAIN ADDRESS = 0x7fff6da87b90
IN FUNCTION ADRESS = 0x7fff6da87b78

Я ожидал того же адреса?

Спасибо за помощь, чтобы понять, что происходит.

Ответы [ 6 ]

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

Вы печатаете указатель на адрес фактических указателей.Удалите & в вашем printf вызове.

printf("IN MAIN ADDRESS = %p\n", string);

и

printf("IN FUNCTION ADRESS = %p\n", myChar);
0 голосов
/ 04 декабря 2011

Когда вы используете амперсанд, вы получаете адрес переменной указателя, а не значение указателя.То есть адрес 'string' (который будет в стеке) и адрес myChar (который также находится в стеке) не совпадают.

Я думаю, вы хотели сделать это без амперсандов перед строкой и myChar.Затем они будут печатать значения, содержащиеся в строке и myChar, которые должны быть одинаковыми.

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

Ответ: вы печатаете неправильные указатели.

IN MAIN ADDRESS &string = 0x7fff60f312b0
IN MAIN ADDRESS string = 0x1014009a0
IN FUNCTION ADRESS &mychar= 0x7fff60f31298
IN FUNCTION ADRESS mychar= 0x1014009a0

Смотрите, когда вы передаете указатель на функцию, создается копия указателя.Таким образом, адрес нового указателя отличается.Но оба указателя указывают на один и тот же адрес.

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

В вашей функции есть ошибка, она должна быть:

printf("IN FUNCTION ADRESS = %p\n", myChar);

Поскольку функция принимает указатель в качестве аргумента, значение этой переменной является адресом, который вы ищете. Используя &, вы фактически получаете адрес памяти самой переменной-указателя, а не адрес того, на что она указывает.

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

Чтобы получить тот же адрес, нужно сделать printf("IN FUNCTION ADRESS = %x\n", myChar);. Когда вы делаете & myChar, вы получаете адрес в стеке, где живет указатель.

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

Нет, потому что вы печатаете адрес указателя, а не сам указатель.Если изменить

printf("IN MAIN ADDRESS = %p\n", &string);

на

printf("IN MAIN ADDRESS = %p\n", string);

и

printf("IN FUNCTION ADRESS = %p\n", &myChar);

на

printf("IN FUNCTION ADRESS = %p\n", myChar);

, значения будут одинаковыми.

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