【问题标题】:Array creation syntax in CC中的数组创建语法
【发布时间】:2016-01-28 00:25:35
【问题描述】:

以下两种C语言创建数组的方法是否等效?

int main( void )
{
    int *array = malloc(sizeof(int) * 10);
    int array2[10];
}

我的想法是方法二是方法一的语法糖,但我不确定。

另外,array 和 array2 在这些声明之后包含什么?我知道数组是指向数组开头的指针,但是数组初始化为什么? array2 怎么样?

【问题讨论】:

  • 不,它们不一样。阅读堆栈内存和堆内存以及 malloc 的实际作用。
  • 一个声明一个数组。另一个声明一个指针,调用malloc 并使指针保存malloc 返回的值。

标签: c arrays syntax


【解决方案1】:

它们不是远程等效的。这个:

int *array = malloc(sizeof(int) * 10);

将分配堆内存块,并为您留下指向该内存的指针。

这个:

int array2[10];

将在堆栈上分配一些内存。阅读有关堆栈和堆内存的出色答案:What and where are the stack and heap?

【讨论】:

  • 所以array 将一直持续到程序退出,而array2 将在它创建的函数返回后立即超出范围。对于两者,我们无法知道这些值最初是什么(即它们没有全部初始化为 0 或其他值)。
  • 或者你可以说array是在运行时(动态)分配的,而array2是在编译时静态分配的。假设 array2 在 main() 函数中声明。
  • @user3386109 够公平的。假设这一切都发生在main() 然后。那么这两种方法本质上是等价的(除非我们尝试在堆栈上创建一个非常大的数组时会遇到问题)。
  • @Adam 您似乎是在说它们“基本上是等价的,除了 ”。沿着这些线,雕像和橙子基本上是等价的,除了雕像是艺术品,橙子是水果,雕像比橙子大,橙子可以食用,而雕像不能,橙子是商品,而雕像往往是独一无二的,等等.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2012-08-27
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多