【问题标题】: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:

    如果大小是一个不是整数常量表达式的表达式... ...每次对其求值时,它的值都应大于零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多