c - 变量地址之间的差异

标签 c memory memory-address

为什么我每次运行程序时变量地址都会有一定的差异(如“printf("%d %d\n", &a, &b);”。它会在一次运行中打印“1000 988” ,另一个是“924 912”,“1288 1276”等等)?编译器是否在每个变量声明后占用一定量的内存,什么都不能写?如果是,它取决于什么?在我的一个程序中使用一些变量,它们之间的最小差异是12个字节,最多达到212。这是唯一一个差异不是12的倍数的情况(其他情况是24、36或48字节)。这背后有什么原因吗?由于我的变量是int类型(在我的系统中占用4个字节),我的变量地址之间的差异是否小于12(例如4)?这些地址差异是否取决于变量类型?如果是,以什么方式?提前致谢!

最佳答案

当今大多数操作系统都使用地址空间布局随机化,以便更难编写某些类型的恶意软件。 (将代码写入内存然后尝试让程序将控制权移交给它的那种;现在必须猜测让程序跳转到哪个地址。)因此,变量不会位于相同的地址每次运行程序时。

根据变量的类型、分配方式以及您运行的操作系统和架构,变量的大小和对齐方式会有所不同。编译器和运行时可能会也可能不会总是将它们放在四字节、八字节或十六字节的边界上。例如,x86_64 函数调用 ABI 始终在 16 字节边界上启动函数的堆栈帧,而 malloc() 的某些实现始终返回可被 16 整除的地址,因为需要将 vector 存储在一些 CPU。

如果你想知道编译器在做什么,你可以尝试编译成汇编。在 gcc 或 clang 上,您可以使用 -S 标志执行此操作。

关于c - 变量地址之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962582/

相关文章:

c - PIC C - USB_CDC_GETC() 和检索字符串

c - 用点 eclipse 代替逗号

iphone - PerformSelector In后台泄漏在设备上

c++ - 手动访问内存地址

c - 打印变量(或指针)的内存位置

c - 我如何制作自己的 fgetc() 函数?

c - 在 C 中优化双线性调整大小算法

c++ - 在内存中搜索字符串导致崩溃

c++ - 内存表大小

C++ 运算符 << 打印对象地址