关于指针和地址的东西

时间:2011-12-04 02:50:00

标签: c memory pointers

我对这段代码的结果感到有点困惑:

#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 个答案:

答案 0 :(得分:2)

您正在打印指向实际指针地址的指针。移除&来电中的printf

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

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

答案 1 :(得分:0)

不,因为您打印指针的地址,而不是指针本身。如果你改变了

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);

值将是相同的。

答案 2 :(得分:0)

要获得相同的地址,您需要执行printf("IN FUNCTION ADRESS = %x\n", myChar);。当您执行&amp; myChar时,您将获得指针所在堆栈的地址。

答案 3 :(得分:0)

您的功能出错,应该是:

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

因为函数接受指针作为参数,所以该变量的值是您要查找的地址。通过使用&amp;,您实际上是获取指针变量本身的内存地址,而不是它所指向的地址。

答案 4 :(得分:0)

你正在打印错误的指针。

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

查看将指针传递给函数的时间,然后创建指针的副本。所以新指针的地址是不同的。但两个指针都指向同一个地址。

答案 5 :(得分:0)

当您使用&符号时,您将获得指针变量的地址,而不是指针值。也就是说,'string'的地址(将在堆栈中)和myChar的地址(也在堆栈中)不一样。

我认为你的意思是在没有字符串和myChar之前的&符号的情况下这样做。然后他们打印string和myChar包含的值,它们应该是相同的。