簡體   English   中英

靜態和動態數組之間的區別

[英]Difference between a static and dynamic array

朋友我剛剛玩了一些指針程序,並意識到GCC(可能是C標准)區分靜態和動態數組。

動態數組具有用於數組中元素地址的占位符,而對於靜態數組,沒有存儲器位置,其中編譯器存儲元素數組的起始地址。

我有一個示例程序來證明我的困惑。

#include <iostream>
#int main(void)
{
  int _static[10];
  int *_dynamic;

  _dynamic = new int [10];

  std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl;
  std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl;

  return 0;
}

對於上面的程序, _static&_static[0]在預期的行上返回相同的地址。 但是, &_static也返回與其他兩個相同的地址。

所以, _static&_static指的是相同的數字(或者我們想要稱之為的地址)。 正如預期的那樣, _dynamic&_dynamic表示不同的位置。

那么,為什么C標准說_static&_static必須引用相同的位置。 這聽起來令人困惑。 我覺得的一個原因是&_static沒有多大意義。 但那么它的使用不應該被報告為錯誤嗎?

有人可以幫我解決這個困惑嗎?

函數內的靜態數組在堆棧上分配。 這樣_static (作為第一個條目的指針衰減), &_static[0]&_static具有相同的值,相同的內存地址。

另一方面,動態數組實際上是指向連續存儲區的指針。 只有指針存儲在堆棧中。 這就是為什么&_dynamic (來自堆棧)和_dynamic (來自堆)的不同。

希望這張圖片顯示一切:

靜態與動態數組

還要看看這篇關於靜態和動態全局數組的文章,繼續區分extern和非extern

實際上_static&_static沒有引用相同的位置。 它們出現的唯一原因是因為你在一個上下文中使用_static ,它會衰變成一個指針。 也就是說,通過您使用它們的方式,您可以它們引用到相同的位置。 但他們之前沒有這樣做 - 一個是數組而另一個是指針。 它們不可能是相同的,因為它們是根本不同的東西。

簡單來說,靜態是在堆棧中創建的,動態是在堆中創建的,在靜態數組中,您必須在程序運行之前告訴大小,但在動態中,您可以從用戶獲取輸入,然后生成該大小的數組。

靜態示例:

int array[5];

動態示例:

int *array;
cout << "Enter size of array: ";
cin >> size;
array = new int[size];

暫無
暫無

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

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