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