作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我连续多次编译和执行这段代码时,它报告 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);
}
最佳答案
因为 C 或 C++ 标准中没有任何东西可以保证这一点。 这些地址可能是可预测的,具体取决于您的编译器/操作系统,但不要指望它。
#include <stdio.h>
int main(void) {
char s[] = "okay";
printf("%p", (void*)s);
return 0;
}
每次我都得到一个不同的地址(Linux 上的 gcc)。不要使用“地址文字”;)
现代操作系统上的进程地址空间是随机的,以确保每次执行时的安全性:
http://en.wikipedia.org/wiki/Address_space_layout_randomization
关于c++ - 为什么我们不能在 C 或 C++ 代码中使用直接寻址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333463/
我是一名优秀的程序员,十分优秀!