为什么我在堆栈中启动的变量之间存在“差距”?

卡罗尔·沃德

在此处输入图片说明

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv) {
    int modified;
    char buffer[64];

    modified = 0;
    gets(buffer);

    if(modified != 0)
        printf("Changed!");
    else
        printf("Not changed!");
}

我正在尝试解决缓冲区溢出问题。

当程序计数器到达if(modified != 0) 时,基指针为 0x00007fffffffdfe0。

在基指针正下方,我看到 4 个字节包含整数 0,这很有意义。

但是,缓冲区并不在修改后的 int 正下方。

它看起来像 4 个字节的 0,然后 0x00007fff 在堆栈中,然后是我输入的 64 个字节的 As 紧随其后。

为什么 char buffer[64] 在 int 修改后没有立即出现?为什么会有“差距”?

我用 gcc -g -fno-stack-protector test1.c -o test1 编译它

谢谢

核桃

你已经有了一个普遍的答案。特别是对于您的平台 (GCC/Linux/x86_64),相关的 ABI (System V x86-64) 指定大小为 16 字节或更大的数组始终至少对齐 16 字节。正如@AdrianMole 在他的回答中所说,这是为了提高性能,特别是允许在阵列上使用 SSE 指令。

请参阅此处链接的 System V x86-64 psABI 1.0 版的第 15 页

如果您使数组大小小于 16 字节,则不会发生这种情况。然而,还有一个 GCC 错误,它意外地将此规则应用于所有大于 16 位(即 2 个字节)的数组。这已在 GCC 7.1 中修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么函数堆栈框架中的参数,变量和框架指针之间存在间隙?

来自分类Dev

为什么我的函数局部变量之间在堆栈中没有存储空间?

来自分类Dev

为什么应用洞察交易明细之间存在差距

来自分类Dev

为什么我的内容之间有这么大的差距

来自分类Dev

为什么ScrollView在我的活动中造成差距?

来自分类Dev

为什么这些内联块div元素之间存在无法解释的差距?

来自分类Dev

堆栈视图-但存在“比例”差距

来自分类Dev

为什么实例变量在Sinatra中的路由之间不存在?

来自分类Dev

为什么我的导航栏和我的页面两侧之间有一点差距?

来自分类Dev

为什么将调用者堆栈的局部变量保存在被调用者堆栈的寄存器中?

来自分类Dev

为什么我的SpriteKit场景中的循环图像之间存在间隙?

来自分类Dev

Android:LinearLayout中的Fragment和TextView之间存在差距

来自分类Dev

为什么我可以在python中全局一个不存在的变量

来自分类Dev

为什么我的堆栈代码中的 pop 方法不执行?

来自分类Java

为什么我们在Hadoop堆栈中需要ZooKeeper?

来自分类Java

为什么我可以“伪造” Java中异常的堆栈跟踪?

来自分类Dev

为什么我不能检查堆栈中的内容?

来自分类Dev

为什么我的网页底部有颜色差距?

来自分类Dev

为什么我的类变量在方法之间改变其值?

来自分类Dev

为什么我的子类的变量不存在?

来自分类Dev

为什么我的函数给我“变量'url'周围的堆栈已损坏”。错误?

来自分类Dev

为什么即使重新启动容器后,我在Docker容器中的非卷数据仍然存在?

来自分类Dev

我的网站内容与其他与差距有关的烦恼之间存在微小差距

来自分类Dev

为什么 SwiftUI 中的 VStack 之间存在 Gap?

来自分类Dev

当我将Kotlin中的MutableList <File>变量传递给List <File>时,Android Studio为什么不启动错误?

来自分类Dev

通过反射改变最终变量,为什么静态和非静态最终变量之间存在差异

来自分类Dev

当我在 Visual Studio Code 中调试文件时,为什么“变量”、“监视”和“调用堆栈”中没有任何内容?

来自分类Dev

为什么将共享变量缓存在CPU缓存中?

来自分类Dev

为什么C ++中存在全局变量?

Related 相关文章

  1. 1

    为什么函数堆栈框架中的参数,变量和框架指针之间存在间隙?

  2. 2

    为什么我的函数局部变量之间在堆栈中没有存储空间?

  3. 3

    为什么应用洞察交易明细之间存在差距

  4. 4

    为什么我的内容之间有这么大的差距

  5. 5

    为什么ScrollView在我的活动中造成差距?

  6. 6

    为什么这些内联块div元素之间存在无法解释的差距?

  7. 7

    堆栈视图-但存在“比例”差距

  8. 8

    为什么实例变量在Sinatra中的路由之间不存在?

  9. 9

    为什么我的导航栏和我的页面两侧之间有一点差距?

  10. 10

    为什么将调用者堆栈的局部变量保存在被调用者堆栈的寄存器中?

  11. 11

    为什么我的SpriteKit场景中的循环图像之间存在间隙?

  12. 12

    Android:LinearLayout中的Fragment和TextView之间存在差距

  13. 13

    为什么我可以在python中全局一个不存在的变量

  14. 14

    为什么我的堆栈代码中的 pop 方法不执行?

  15. 15

    为什么我们在Hadoop堆栈中需要ZooKeeper?

  16. 16

    为什么我可以“伪造” Java中异常的堆栈跟踪?

  17. 17

    为什么我不能检查堆栈中的内容?

  18. 18

    为什么我的网页底部有颜色差距?

  19. 19

    为什么我的类变量在方法之间改变其值?

  20. 20

    为什么我的子类的变量不存在?

  21. 21

    为什么我的函数给我“变量'url'周围的堆栈已损坏”。错误?

  22. 22

    为什么即使重新启动容器后,我在Docker容器中的非卷数据仍然存在?

  23. 23

    我的网站内容与其他与差距有关的烦恼之间存在微小差距

  24. 24

    为什么 SwiftUI 中的 VStack 之间存在 Gap?

  25. 25

    当我将Kotlin中的MutableList <File>变量传递给List <File>时,Android Studio为什么不启动错误?

  26. 26

    通过反射改变最终变量,为什么静态和非静态最终变量之间存在差异

  27. 27

    当我在 Visual Studio Code 中调试文件时,为什么“变量”、“监视”和“调用堆栈”中没有任何内容?

  28. 28

    为什么将共享变量缓存在CPU缓存中?

  29. 29

    为什么C ++中存在全局变量?

热门标签

归档