簡體   English   中英

數組變量在哪里用C語言存儲?

[英]Where is an array variable stored in C language?

#include <stdio.h>

int main(){
    int array[] = {1,2,3};
    printf("L00: array[0]=%d \n",array[0]);
    printf("L01: array[1]=%d \n",array[1]);
    printf("L02: array[2]=%d \n",array[2]);
    printf("L03: &array[0]=%p \n",&array[0]);
    printf("L04: &array[1]=%p \n",&array[1]);
    printf("L05: &array[2]=%p \n",&array[2]);
    printf("L06: array=%p \n",array);
    printf("L07: &array=%p \n",&array);
    return 0;
}

在該程序中,L03,L06和L07分別顯示( &arrayarray&array[0] )相同的存儲器地址。

所以我很好奇“陣列”作為RAM中變量的位置。

如果RAM中沒有“數組”的位置,它在哪里?

C11標准規范沒有提及有關RAM,IIRC的任何內容(但請自行檢查,閱讀n1570 )。 在大多數操作系統上進程具有虛擬地址空間 (並且您的程序將在該空間中運行,而不一定在RAM中運行)。

您的陣列(可能)位於調用堆棧中

我想一個假設的優化編譯器可能足夠聰明,可以把它放在別處(但我不能說這樣的編譯器)。

我必須多次寫這篇文章,但讓我們再說一遍:

+----------+----------+----------+
| array[0] | array[1] | array[2] |
+----------+----------+----------+
^          ^          ^          ^
|          |          |          |
array      |          |          |
|          |          |          |
array + 0  array + 1  array + 2  |
|          |          |          |
&array[0]  &array[1]  &array[2]  |
|                                |
&array                           |
|                                |
&array + 0                       &array + 1

從上面的“圖像”可以看出,第一個元素可以通過五個指針到達(兩個實際上, array衰減到&array[0] ,而array + 0等於array )。

這些指針的類型可能不同但是:

  • &array的類型為int (*)[3]
  • &array + 0等於&array ,因此屬於同一類型
  • &array[0]的類型為int *
  • array衰減到&array[0] ,因此屬於同一類型
  • array + 0等於array ,因此屬於同一類型

當然有其他方法可以獲得指向特定元素的指針,但它們實際上只是上述的變體。 例如(&array)[0]等於&array + 0 ,它等於&array

另一件值得注意的事情是,對於任何指針數組p和索引i ,表達式p[i]*(p + i)完全相同。


你應該從中學到的最重要的事情是array&array之間的區別。 即使它們都指向相同的位置,它們的類型也不同,這使得它在語義上非常不同。

除了具有“自動存儲持續時間”和本地范圍之外,C標准並未規定存儲陣列的位置。 具有自動存儲持續時間的較大變量幾乎肯定存儲在堆棧中。

至於為什么這3種不同形式的語法給出相同的地址:

  • array ,無論何時在表達式中使用,都會衰減為指向第一個元素的指針。 使其100%等效於&array[0]
  • &array是指向整個數組的指針 - 一個數組指針。 這是一種不同的類型,可用於對整個數組進行指針運算,但除此之外,它仍然指向數組開始的相同地址。

(&array,array和&array [0])相同的內存地址。

是的,但它們的類型不同。

  • &array的類型為int (*) [3]
  • array的類型為int [3] (有時會衰減為指向第一個元素的指針)
  • &array[0]的類型為int *

根據定義,數組的內存分配是連續的,它從&array[0]並上升到n-1元素, n是維度。

如果RAM中沒有“數組”的位置,它在哪里?

如果用“RAM”表示物理內存地址,那么你的概念是錯誤的。 大多數情況下,你沒有直接使用任何物理內存,它是抽象給你的。 打印的內存位置來自分配給程序的虛擬進程地址空間。

根據存儲持續時間,您可以看到位置不同,即,如果陣列具有自動存儲,它將駐留在功能堆棧(調用堆棧)上,它具有static存儲,可能它將在.bss部分。 有時它也可能會被優化(不是在這種情況下,如果不使用),所以這取決於環境。 除非編譯器決定分配它,否則無法保證分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM