c++ - 为什么我们不能在 C 或 C++ 代码中使用直接寻址?

标签 c++ c pointers

当我连续多次编译和执行这段代码时,它报告 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/

相关文章:

缓存模拟器::命中与未命中问题

c - 国际对/秒。长C

c++ - SDL_Renderer通过函数后不会显示纹理

c++ - 尝试在按下时消除此按钮的抖动

C++ 时间函数在不同调用时返回相同的值

c - 如何在输入端检测破损的管道?

c - 强制转换指针的算术

c - 结构体中元素之一的数组初始化

Android NDK C++ 文件保持文件结构

c++ - 堆栈大小估计