gpt4 book ai didi

c - 变量地址之间的差异

转载 作者:太空狗 更新时间:2023-10-29 16:05:43 25 4
gpt4 key购买 nike

为什么我每次运行程序时变量地址都会有一定的差异(如“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com