数组名称是否还会在C中的内存中占用空间?

时间:2018-07-06 17:28:21

标签: c arrays pointers

此视频中的数字表明数组名称也占用了内存空间 https://youtu.be/HXF3XSmqB1M enter image description here

2 个答案:

答案 0 :(得分:5)

除了数组元素本身之外,没有为对象留出任何内存。如果您将数组声明为

T a[N]; // for any type T

那么你在内存中得到的是

   +---+
a: |   | a[0]
   +---+
   |   | a[1]
   +---+
    ...
   +---+
   |   | a[N-1]
   +---+

没有对象aa[0]a[1]等分开。除非它是sizeof或一元&运算符的操作数,否则表达式 a将从类型“ T的N元素数组”的表达式转换(“衰减”)为“指向{{1}的指针”的表达式}”,表达式的值将是数组第一个元素的地址。 IOW,T 1


  1. 请参阅this paper,了解Ritchie采取这种方法的动机。 C源自较早的语言B,该语言 did 为数组对象预留了额外的内存。 Ritchie希望保留B的数组语义,但不要保留额外的指针,因此他设计了此规则,以便在编译期间用指针替换数组表达式。

答案 1 :(得分:4)

否,数组名称不会“占用内存空间”。

我认为我不喜欢那个视频。也许只是我一个人,但是当我看到一个带有箭头的盒子指向另一个盒子时,它是一个指向某个地方的指针值。但是数组不是 not 指针。 (可能的讲师经常将数组名称描述为“常量指针”,或者绘制像该视频中那样令人误解的图片,并且使一代又一代的C语言学习者感到困惑,想象数组是指针,并想知道指针值的实际位置存储。)

这里有一些声明和一张可爱的ASCII艺术图片,显示了我想如何考虑数组和指针:

int i = 5;
int *ip = &i;
int a[10] = {11, 22, 33};
int *ip2 = a;

     +-------+
 ip: |   *   |
     +---|---+
         |
         V
     +-------+
  i: |   5   |
     +-------+

     +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
  a: |  11   |   22  |  33   |   0   |   0   |   0   |   0   |   0   |   0   |   0   |
     +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
         ^
         |
     +---|---+
ip2: |   *   |
     +-------+

在此图片中,方框是实际的存储器块(字节)。它们旁边的标签,例如i:a:是符号。它们提供了内存中特定位置的名称,但是它们本身不会占用任何空间。

尤其是,数组名a是存储数组内容的内存的第一个字节的位置的名称,就像名称i是存储区的名称一样。变量值存储在内存中的第一个字节。

再次,数组名a不会占用内存中的任何空间。尤其不是ip2之类的东西。 ip2是一个指针变量,它确实会占用内存空间,并且当前指向数组a

诀窍是-这确实是一个窍门,但每个C程序员都必须适应-在上述声明的基础上,我们可以同时编写a[2]ip2[2],这两个表达式都获取数组中的第三个值,即数字33。

另请参见旧版section 6中的C FAQ list,尤其是问题6.36.10