【问题标题】:Is a pointer variable created for stack local array?是否为堆栈本地数组创建了指针变量?
【发布时间】:2014-07-13 20:06:06
【问题描述】:

考虑以下代码:

#include <iostream>

int main()
{
    int index;
    std::cin >> index;

    int* dynArray = new int[5];
    dynArray[index] = 1;

    int stackArray[5];
    stackArray[index] = 1;
}

我确定dynArray 是一个简单的int* 指针,它在堆栈上占用额外的sizeof(int*) 字节。

问题 1:是否还在堆栈上为 stackArray 创建了一个额外的指针变量?如果是这样,那总是发生吗?如果不是,那么stackArray[index] = 1; 在不知道数组基数的情况下如何工作,即编译器如何决定将什么值添加到index 以计算地址?

问题2:C/C++有什么区别吗?

我想要这两种环境的答案:

  1. GCC/Linux,x86
  2. Visual Studio 2013,x86

【问题讨论】:

  • @ArunMu 这与问题关系不大。
  • 首先,int* dynArray = new int[5]int stackArray[5] 的类型不同。
  • @40two 正确,这就是我问这个问题的原因。
  • 使用 gcc 您可以使用 -S 标志编译代码以生成汇编代码并自行验证两个数组的分配方式。不过,我希望 dynArray 在堆中。不知道VS2013有没有类似的选项

标签: c++ c arrays pointers


【解决方案1】:
  • dynarray 是一个变量。它的类型是int *,它具有自动存储持续时间(“在堆栈上”)。它的值是指向其他地方某个元素的指针。它恰好指向其他地方的某个数组的元素这一事实在某种程度上是偶然的。

  • stackArray 是一个变量。其类型为int[5],具有自动存储期限。它的值是一个由五个整数组成的数组。当您在 stackArray[index] 这样的表达式中使用变量的名称时,该表达式表示相应的数组元素(它是数组对象的子对象)。

请注意,在您的示例中,dynarray[index] 是元素的数组本身不是变量,元素本身也不是。您只能访问元素对象,因为您有指向它们的指针。 (事实上​​,你根本无法表达数组对象本身,因为它的类型在编译时是已知的。动态数组是 C++ 中真正动态类型的一部分。)

【讨论】:

  • 从概念上讲,讨论数组衰减可能对 OP 有帮助。
  • stackArray[index], that expression denotes the corresponding array element: 好的,但这是怎么发生的呢?它会神奇地计算??? + index吗? ??? 应该是某物
  • @BabkenVardanyan:这有关系吗?当您拥有pair&lt;int, int&gt; x; 并说x.second = 10 时,您是否关心“它是如何工作的”?该语言具有数组类型和寻址数组对象的元素子对象的概念。这还不够吗? (是的,有关于指针算术和数组到指针衰减的规则,但我认为你不需要知道这些来理解数组。)你可以类似地问int a; a = 10; 是如何工作的(为什么你不必比如*&amp;a = 10?) - 但是能够访问变量只是语言的一部分......
【解决方案2】:
  1. stackArray 是一个数组,而不是一个指针。它的类型是int[5],即5整数数组。编译器知道数组元素的类型intstackArray[index] 被评估为 *(stackArray + index)。在这里,数组stackArray 计算为指向其第一个元素的指针。

  2. CC++ 在具有自动存储分配的数组方面是相同的。

【讨论】:

  • @juanchopanza 谢谢。删除了误导部分。
  • Here, the array stackArray evaluates to a pointer to its first element: 好的,那么评估结果存储在哪里?它是在运行时还是编译时评估(计算)的?
  • @BabkenVardanyan 它在编译时进行评估。它不被存储,但用于确定值1 存储在语句stackArray[index] = 1; 中的地址。详情请阅读本文stackoverflow.com/q/21972465/1809377
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2019-01-15
  • 2020-01-03
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2017-06-02
相关资源
最近更新 更多