当我连续编译并执行此代码几次时,它会将cc的地址报告为0x0012FF5C.但是当我尝试在foo中使用第二次调用printf打印出该地址的字符串时,它会打印出垃圾而不是打印出"Hello"?为什么这样??当我知道地址位于应用程序的地址空间内时(至少我不重新启动我的PC,或者启动其他需要大量空间的应用程序并且导致其他原因)我直接将地址作为参数进行了论证是错误的我的申请被分页了???
void foo(char *cc[])
{
printf("%x\n",cc);
printf("%s\n",(char *)(0x0012FF5C));
}
int main()
{
char *c[] = {"Hello","World"};
foo(c);
}
Run Code Online (Sandbox Code Playgroud)
del*_*ver 12
因为C或C++标准中没有任何内容可以保证这一点.根据您的编译器/操作系统, 这些地址可能是可预测的,但不要依赖它.
#include <stdio.h>
int main(void) {
char s[] = "okay";
printf("%p", (void*)s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我每次都得到一个不同的地址(linux上的gcc).不要使用"地址文字";)
现代操作系统上的进程地址空间随机化,以确保每次执行的安全性:
http://en.wikipedia.org/wiki/Address_space_layout_randomization
好的,首先,永远不要假设多次执行将返回相同的地址
现在.让我们说你很幸运并获得相同的地址.请注意,这cc是一个指针数组.并且您正在发送此阵列的基地址.您需要发送数组的第一个元素的值
试试这个,如果幸运的话,
printf("%s\n",*((char**)(0x0012FF5C)));
Run Code Online (Sandbox Code Playgroud)
您的进程的内存位置可能在两次执行之间发生了变化。你不能这样做,你正在尝试读取一个未由你的进程分配的地址。此外,我有很多警告:
\n\n\ntest.c:在函数 \xe2\x80\x98foo\xe2\x80\x99 中:test.c:6:警告:格式 \xe2\x80\x98%x\xe2\x80\x99 需要类型 \xe2\x80\x98unsigned int\xe2\x80\x99,但参数 2 的类型为 \xe2\x80\x98char **\xe2\x80\x99
\ntest.c:7: 警告:格式 \xe2\x80\x98%s\xe2\x80\x99 需要类型 \xe2\x80\x98char *\xe2\x80\x99,但参数 2 的类型为 \xe2\x80\x98int \xe2\x80\x99
\ntest.c:9: 警告:格式 \xe2\x80\x98%x\xe2\x80\x99 需要类型 \xe2\x80\x98unsigned int\xe2\x80\x99,但参数 2 的类型为 \xe2\x80\x98char **\xe2\x80\x99
\n