c - 在 C 中声明数组时如何将其放在堆栈上?
问题描述
为了了解缓冲区溢出漏洞,我正在寻找有关声明数组时堆栈实际外观的一些说明。对于以下代码:
int main()
{
int a = 0;
char b[8];
char c[8];
我知道堆栈将如下所示:
但如果代码改为:
int main()
{
int a = 0;
int b[8];
char c[8]
堆栈是什么样的?我认为它将是 4 个字节 a,然后是 32 (8*4) 个字节 b,然后是 8 个字节用于 c。但是,我不完全确定索引在那时将如何工作(它是最接近 a 的 b[0] 还是 b[7]?)。
任何澄清都会有所帮助,谢谢!
解决方案
首先,您可能不会假设在将变量放入堆栈时会使用任何特定的顺序。编译器可以选择顺序。这在使用优化时经常发生。在这种情况下,编译器可能不会在堆栈上分配空间,直到第一次引用该变量。
此外,如果变量是短暂的,编译器可能会选择根本不使用堆栈,并且可能会将变量存储在 CPU 寄存器中。
至于需要多少内存,这将取决于系统。一些系统可能允许一次分配 8 位。某些系统可能会强制所有内容为 32 位宽度。一些系统可能会添加填充以确保较大的宽度变量正确对齐。
推荐阅读
- powershell - If语句反对动态变量
- javascript - 获取所有类型的电影
- amazon-web-services - AWS Lex 和 Facebook Messenger 集成不起作用
- while-loop - 我在 switch 语句中遇到重复 while 循环的问题,循环继续重复
- excel - Vba 将 Outlook 共享邮箱中的电子邮件导入 Excel
- python - 需要根据另一个列表元组索引在列表中排列元组
- javascript - php codeigniter更改后如何获取表的td id val
- java - Spring Framework 5 简单 bean 示例 - 为什么出现 NoSuchBeanDefinitionException
- spring-data-rest - 如何在 SDR 中指定偏移量字段
- c++ - MinGW 的大型算术失败