C中的指针,如何获得地址。苹果系统

时间:2016-05-07 17:19:38

标签: c

我一直在尝试研究C大约3天,并且有关于指针/地址的问题

这是我的代码

#include <stdio.h>

#define EOL '\n'

int main()
{
    char one = 1;
    char two = 2;
    char three = 3;

    char* onePointer = NULL;
    char* twoPointer = NULL;
    char* threePointer = NULL;

    onePointer = &one;
    twoPointer = &two;
    threePointer = &three;

    printf("%cOne variables: %d%c", EOL, one, EOL);
    printf("Two variables: %d%c", two, EOL);
    printf("Three variables: %d%c", three, EOL);

    printf("%cOne adress: 0x%X%c", EOL, onePointer, EOL);
    printf("Two adress: 0x%X%c", twoPointer, EOL);
    printf("Three adress: 0x%X%c", threePointer, EOL);


    return 0;
}

当我尝试编译它时,我收到以下错误&#34;警告:格式指定类型&#39; unsigned int&#39;但是这个论点有类型&#39; char *&#39;       [-Wformat]在这里输入代码     printf(&#34;%cOne地址:0x%X%c&#34;,EOL,onePointer,EOL);&#34; 相同的代码适用于WINDOWS 7.(我一直在观看youtube课程,其中的人在win7上编写此代码)

如果我将%X更改为%p,则会成功编译&#34;

One variables: 1
Two variables: 2
Three variables: 3

One adress: 0x0x7fff52381c0b
Two adress: 0x0x7fff52381c0a
Three adress: 0x0x7fff52381c09"

但如果我再次运行输出文件,每次我有不同的地址都可以吗?

One variables: 1
Two variables: 2
Three variables: 3

One adress: 0x0x7fff55b56c0b
Two adress: 0x0x7fff55b56c0a
Three adress: 0x0x7fff55b56c09

哦,另外一个问题,我开始研究WIN,然后继续使用mac os,因为在iOS开发方面看。所以在windows中我可以创建一个函数

char main()
void main(void)

而在Mac OS中,如果重新创建此示例,则会收到错误消息:  &#34;警告:返回类型&#39; main&#39;不是&#39; int&#39; [-Wmain-返回型]&#34; 为什么?

2 个答案:

答案 0 :(得分:3)

您应该使用%p而不是%X打印指针。

每次看到不同地址这一事实是正常的。请在此处阅读:https://en.wikipedia.org/wiki/Address_space_layout_randomization

至于main()的签名,必须返回int。在所有平台上。其他东西只是一些特殊的平台,让你做你不应该做的事情。

答案 1 :(得分:0)

%X是十六进制整数的格式说明符。根据平台体系结构,十六进制整数可能与指针的大小不同。因此,请使用指针格式说明符:%p,以便您的代码更具可移植性。

搜索并阅读printf格式说明符以获取更多信息。

当这些是常量时,为行返回提供格式说明符%c是不合适的,这与变量的变量值不同。当你可以直接在格式字符串中写入\ n时,为什么要让代码执行额外的工作来将字符串写入字符串? (如果您认为以后会重新定义EOL,那将是有意义的)

main()有一个返回类型,因为它可以用来将程序的成功或失败传递给另一个调用进程,特别是当你的程序更像是一个命令行工具而不是一个可视化通信的gui驱动程序时用户。想想shell脚本如何调用其他工具并获取结果。

另见:

What should main() return in C and C++?

指针是内存中的地址。在运行之间地址不同应该不足为奇。除了引用的安全原因之外,还有许多因素会影响在运行时为方法中的变量分配哪些内存地址块。考虑在向程序中添加更多变量和方法时可用内存的变化,更不用说当前计算机上的其他进程如何使用内存。把它想象成在电影院中占有一席之地。你能得到什么样的座位取决于剧院目前的居住者。