【问题标题】:Array declaration and memory layout数组声明和内存布局
【发布时间】:2023-04-09 04:00:01
【问题描述】:
如果数组是本地的,我知道数组在堆栈中分配了大小。如何在代码中为以下数组分配内存。此外,当我给出像 -20 这样的负输入时,答案是 -80。它用于在早期的编译器中给出错误,但现在不是。那么现在是怎么处理的呢?
int main()
{
int i;
scanf("%d",&i);
int a[i];
printf("%d",sizeof(a));
}
【问题讨论】:
标签:
c++
c
memory
operating-system
【解决方案1】:
您拥有的是 Variable length array(VLA),这在 C 标准中是允许的,但在 C++ 中是不允许的。
大多数 C++ 编译器通过编译器扩展提供对它的支持。 C++ 标准提供了一个std::vector,它通常用于 C++ over VLA,因为使用 VLA 会使您的代码不可移植。
对于用户程序,VLA 的元素位于连续的内存位置,就像普通数组一样。唯一的区别是数组的长度可以在运行时指定。
当您向 VLA 提供负大小时,您调用的是未定义行为。
参考:
C99 标准 §6.7.5.2:
如果大小是一个不是整数常量表达式的表达式... ...每次对其求值时,它的值都应大于零。