const在C和C++中在分配內存上的區別

  • c語言全局const會被存儲到只讀數據段。c++中全局const當聲明extern或者對變量取地址時,編譯器會分配存儲地址,變量存儲在只讀數據段。兩個都受到了只讀數據段的保護,不可修改。
const int constA = 10;
      int main(){
           int* p = (int*)&constA;
           *p = 200;
     }

以上代碼在c/c++中編譯通過,在運行期,修改constA的值時,發生寫入錯誤。原因是修改只讀數據段的數據。

  • c語言中局部const存儲在堆棧區,只是不能通過變量直接修改const只讀變量的值,但是可以跳過編譯器的檢查,通過指針間接修改const值。
const int constA = 10;
	int* p = (int*)&constA;
	*p = 300;
	printf("constA:%d\n",constA);
	printf("*p:%d\n", *p);

運行結果:

constA:300
*p:300

c語言中,通過指針間接賦值修改了constA的值。
c++中對於局部的const變量要區別對待

  1. 對於基礎數據類型,也就是const int a = 10這種,編譯器會把它放到符號表中,不分配內存,當對其取地址時,會分配內存。
const int constA = 10;
	int* p = (int*)&constA;
	*p = 300;
	cout << "constA:" << constA << endl;
	cout << "*p:" << *p << endl;

運行結果:

constA:10
*p:300

constA在符號表中,當我們對constA取地址,這個時候爲constA分配了新的空間,*p操作的是分配的空間,而constA是從符號表獲得的值。

  1. 對於基礎數據類型,如果用一個變量初始化const變量,如果const int a = b,那麼也是會給a分配內存。
int b = 10;
	const int constA = b;
	int* p = (int*)&constA;
	*p = 300;
	cout << "constA:" << constA << endl;
	cout << "*p:" << *p << endl;

運行結果:

constA:300
*p:300

constA 分配了內存,所以我們可以修改constA內存中的值。

  1. 對於自定數據類型,比如類對象,那麼也會分配內存。
const Person person; //未初始化age
	//person.age = 50; //不可修改
	Person* pPerson = (Person*)&person;
	//指針間接修改
	pPerson->age = 100;
	cout << "pPerson->age:" << pPerson->age << endl;
	pPerson->age = 200;
	cout << "pPerson->age:" << pPerson->age << endl;

運行結果:

pPerson->age:100
pPerson->age:200

爲person分配了內存,所以我們可以通過指針的間接賦值修改person對象。

  • c中const默認爲外部連接,c++中const默認爲內部連接.當c語言兩個文件中都有const int
    a的時候,編譯器會報重定義的錯誤。而在c++中,則不會,因爲c++中的const默認是內部連接的。如果想讓c++中的const具有外部連接,必須顯示聲明爲:
    extern const int a = 10;

const由c++採用,並加進標準c中,儘管他們很不一樣。在c中,編譯器對待const如同對待變量一樣,只不過帶有一個特殊的標記,意思是”你不能改變我”。在c++中定義const時,編譯器爲它創建空間,所以如果在兩個不同文件定義多個同名的const,鏈接器將發生鏈接錯誤。簡而言之,const在c++中用的更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章