对于此代码:

#include<stdio.h>

void hello() { printf("hello\n"); }
void bye()   { printf("bye\n");   }

int main() {
    printf("%p\n", hello);
    printf("%p\n", bye);
    return 0;
}

我的机器上的输出:
0x80483f4
0x8048408

[第二个地址的值较大]

Codepad
0x8048541
0x8048511

[第二个地址的值较小]

这与机器的字节序有关吗?如果不,
  • 为什么地址顺序不同?
  • 另外,为什么区别不同?

    0x8048541-0x8048511 = 0x30

    0x8048408-0x80483f4 = 0x14


  • 顺便说一句,我刚刚检查。这段代码(取自here)说这两个机器都是Little-Endian
    #include<stdio.h>
    int main() {
        int num = 1;
        if(*(char *)&num == 1)
            printf("Little-Endian\n");
        else
            printf("Big-Endian\n");
        return 0;
    }
    

    最佳答案

    它与耐久性无关,而与C++标准有关。 C++不需要按照您看到它们到磁盘的顺序来编写函数(并考虑跨文件链接,甚至链接其他库,这是不可行的),它可以按其希望的任何顺序编写它们。

    关于实际值之间的差异,一个编译器可能会在一个块周围添加保护以防止内存覆盖(或其他相关内容,通常仅在 Debug模式下使用)。没有什么可以阻止编译器在您的两个函数之间编写其他函数。请记住,即使是一个简单的hello world应用程序也带有数千字节的可执行代码。

    最重要的是:永远不要假设事物在内存中的位置。您的假设几乎总是错误的。为什么还要假设?无论如何,编写正常,安全,结构化的代码没有任何收获。

    关于c++ - 这与字节序有关吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2839017/

    10-11 15:16