當前位置:首頁 » 服務存儲 » 常量存儲區域可以改寫嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

常量存儲區域可以改寫嗎

發布時間: 2022-01-19 09:33:02

㈠ 請教c語言高手,C語言常量變數能通過地址去修改嗎

問針對問題3:staticconstinta=10;後a在常量區,該內存塊不允許修改,如果修改系統會拋出異常,可改成下面代碼,在VC2010下測試:

#include <stdio.h>
#include <stdlib.h>
int main()
{
static const int a=10;
int *p,b;
p=(int *)&a;
try
{
*p=20;
printf("try【%d,%d】",a,*p);
}
catch(...)
{
printf("catch【%d,%d】",a,*p);
}
system("pause");
return 0;
}

說明:編譯時要求修改

VS2010-項目屬性- C/C++ - code generation - Enable c++ exceptions --Yes with SEH Exceptions (/EHa),你可以直接在c/C++的command line中自己填上 /EHa否則肯定捕獲不到

㈡ 全局變數為何是靜態存儲類型,它的值不能被改變嗎

每個程序運行的時候,系統會為程序分配4個區(棧區、堆區、靜態區、代碼區),(對於c語言而言)。
棧區存放auto變數,也就是臨時變數。堆區存放堆變數(也就是malloc的地址,手動分配內存的方式)。代碼區存放你寫的程序代碼。而靜態區存放的就是全局變數和常量的,(靜態區也細分為全局區和常量區(在linux下))。
所以常量的存儲方式為靜態存儲。這種層的東西國人也就是理解層面的,不深。
你可以自己查查有關內存四區的知識,或者看看嗨翻c這本書。

㈢ 哪些方法可修改常量存儲區 pragma comment

#pragma comment (lib,"..\\Release\\gahsysmode.lib") 象這樣就行了,這是在VC2010中測試的,因為是自己寫的dll所以.lib文件在此文件夾

㈣ 常量存儲區和靜態存儲區有什麼區別 static const int a=10;是存到常量存儲區還是靜態存儲區

如樓上所說,常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的。
c語言中const好像沒有用處。
static const int a=10;我個人認為是存到靜態區的。你可以上網搜一下static const修飾的變數是如何賦初值的,一般有兩種方法。一是定義時直接賦初值,二是類外賦初值。而常量是無法用這兩種方法賦初值的。

㈤ 弱弱地問一下,是不是定義在函數之外的變數都是存儲在靜態全局區的,也就是不能修改的

變數的屬性跟關鍵字有關,如const int a = 3;就是定義一個常量(不可更改的)可以在函數內部也可以在函數外部。定義在函數外面的是全局變數,即在當前源文件任何函數裡面都可以使用,在多個文件中extern關鍵字申明也可以使用。變數的位置決定了它的有效范圍,而修飾的關鍵字決定了它的屬性,如static const volatile 等

㈥ eeprom存儲器中的內容正常工作時可不可以改寫

所謂EEPROM
就是電可擦除可編程只讀存儲器。
就EEPROM本身而言,正常工作時可以改寫,是EEPROM
的基本功能。
但如果這個EEPROM中存儲的是程序代碼,且正在運行中,則有可能被CPU屏蔽掉擦寫功能。

㈦ 靜態存儲區和常量存儲區有什麼區別

一、靜態存儲區和常量存儲區的區別:
1、靜態存儲區,全局變數和靜態變數被分配到同一塊內存中;常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,是不允許修改的。
2、靜態存儲是main函數運行前分配內存並初始化;常量存儲是固化在執行文件上的數據。棧的方向和平台有關,一般來說,windows由高地址向低地址增長,linux相反,但linux演變出來的操作系統不排除有特殊情況。
3、常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的
二、靜態存儲區和常量存儲區介紹
1、靜態存儲區:所有的靜態對象,全局對象都於靜態存儲區分配,全局變數和靜態變數被分配到同一塊內存中,在以前的 C 語言中,全局變數又分為初始化的和未初始化的(初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數與靜態變數在相鄰的另一塊區域,同時未被初始化的對象存儲區可以通過 void* 來訪問和操縱,程序結束後由系統自行釋放),在 C++ 裡面沒有這個區分了,他們共同佔用同一塊內存區。
2、常量存儲區:這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
三、注意事項:常量字元串都存放在靜態存儲區,返回的是常量字元串的首地址.

㈧ c++全局/靜態存儲區和常量存儲區是一樣的嗎

當然不一樣,下面詳細講解一下內存分配的幾個區:
棧:
就是那些由編譯器在需要的時候分配,
在不需要的時候自動清除的變數的存儲區。
裡面的變數通常是局部變數、函數參數等。
在一個進程中,位於用戶虛擬地址空間頂部
的是用戶棧,編譯器用它來實現函數的調用。
和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。

堆:
就是那些由new分配的內存塊,他們的釋放編譯器不去管,
由我們的應用程序去控制,一般一個new就要對應一個delete。
如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
堆可以動態地擴展和收縮。

自由存儲區,
就是那些由malloc等分配的內存塊,他和堆是十分相似的,
不過它是用free來結束自己的生命的。

全局/靜態存儲區,
全局變數和靜態變數被分配到同一塊內存中,
在以前的C語言中,全局變數又分為初始化的
和未初始化的(初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數與靜態變數在相鄰的另一塊區域,
同時未被初始化的對象存儲區可以通過void*來訪問和操縱,
程序結束後由系統自行釋放),在C++裡面沒有這個區分了,
他們共同佔用同一塊內存區。

常量存儲區,
這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改

㈨ 在c語言中,字元串作在全局區不可修改,那麼在堆區可以修改嗎

指針p最後指向的是常量區,內部不可被修改

將代碼p = "asjwoep;sd'asd";改為strcpy(p,"asjwoep;sd'asd");

指針p依舊指向堆區,將內容賦值為字元串,後面的修改就是合法的

㈩ const常量可以在程序中改變其值。對不對

const是常量,其內容在代碼段,該內容無法修改,賦值不能成功,有些數不希望能更改的,那麼這些數最好不要聲明為變數。。。對於PC無所謂,定義成變數無非就是不小心被改,悲劇了而已,const你賦值操作不會編譯通過,也不會出現這種風險,理論上注意點就沒問題。。。。。
但對於嵌入式晶元這一點const就很重要,沒有const數據是在數據存儲區,而對於嵌入式晶元很多數據存儲區很小,不用const會帶來額外開銷。。。帶const則數據在程序存儲器ROM,這里通常很大,無所謂。。。不過C#畢竟不會用在嵌入式代碼里,嵌入式開發一般用C語言,只是提一下const的優點。。。