Laz*_*zer 1 c c++ memory-management function-pointers endianness
对于此代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我机器上的输出:
0x80483f4
0x8048408
Run Code Online (Sandbox Code Playgroud)
[第二个地址价值更大]
在键盘上
0x8048541
0x8048511
Run Code Online (Sandbox Code Playgroud)
[第二个地址的价值较小]
这与机器的字节序有什么关系吗?如果不,
为什么地址排序有所不同?
另外,为什么区别差异?
0x8048541 - 0x8048511 = 0x30
0x8048408 - 0x80483f4 = 0x14
顺便说一下,我刚检查过.这段代码(取自这里)说这两台机器都是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;
}
Run Code Online (Sandbox Code Playgroud)
它与endinanness无关,但与C++标准无关.C++不需要按照您将它们看到磁盘的顺序编写函数(并考虑跨文件链接甚至链接其他库,这是不可行的),它可以按照它希望的任何顺序编写它们.
关于实际值之间的差异,一个编译器可能会在块周围添加防护以防止内存覆盖(或其他相关内容,通常仅在调试模式下).并且没有什么能阻止编译器在两个函数之间编写其他函数.请记住,即使是一个简单的hello world应用程序也带有数千字节的可执行代码.
底线是:永远不要假设事物在内存中的位置.你的假设几乎总是错误的.为什么甚至假设?无论如何,在编写普通的,安全的,结构化的代码方面没有任何好处.