一个由初始化列表初始化的数组存储在哪里?

5

给定下面这段代码:

(void)someFunction(void) {
    int array[] = {1,2,3,4,5,6,7,8,9,10};
}

数组的值存储在哪里?

  • 栈?
  • 堆?
  • 与字符串字面量一起。(称为高频堆吗?)
  • 其他地方?

我问这个问题是因为我不确定:

在 Objective-C 中创建整数数组属性

3个回答

9
该数组本身将位于堆栈中。在函数进入时,会有一些代码将存储在全局/静态内存区域中的未命名数组中的值复制到堆栈上的本地数组中。该具有初始值的未命名全局/静态数组很可能位于与字符串字面量相同的一般内存区域中。
但请注意,标准不要求这些操作,但几乎任何编译器都会实现它。足够聪明的编译器可能会注意到这些值只是递增的整数值,并生成一个循环来初始化本地数组。
(此答案假定为C / C ++ - 我不知道Objective-C是否会更改任何内容)。

1
正如Micheal所说,初始化列表中的值将存储在哪里取决于编译器和优化级别。例如,没有进行优化的gcc只会生成将常量移动到数组中适当位置的代码,即实际值仅存储在代码本身中。如果您不编译为目标代码,而是让编译器输出汇编代码,您可以轻松地检查会发生什么。

-1
如果有人正在阅读这篇文章并寻找C#相关信息,那么答案是不同的。数组是引用类型,因此值存储在堆上,并在栈上引用。

这个问题是关于C语言的。它与C#无关。 - Adam Rosenfield
你的回答没有用处的原因是你只谈到了C#。想象一下,如果每种语言都发表这样的回答会发生什么。但是,欢迎你补充说明,作为评论指出这仅适用于C,在其他语言中,如C#,数组存储在堆上。 - Georg Schölly
天啊,难道没有人再读书了吗?我需要多么清晰明了地表明这是给那些遇到问题并想要了解C#答案的人看的呢? - Rap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接