函式裡定義的字串常量與字元指標

2021-06-18 13:49:35 字數 1910 閱讀 3015

問題:

char *getstring(void) 

void test4(void)

// char p = "hello world"; 這句helloworld 常量在靜態區,會隨著函式結束消失嗎?

解答:

在windows環境下"hello world"在程式結束前不會消失

聯結器在連線.exe檔案時,將"hello world"儲存在.exe檔案(pe檔案格式)的.rdata區內(唯讀儲存區)。在執行這個.exe檔案時,它被對映至程序的位址空間(一般為0x00400000處,所以"hello world"可能在類似0x00420c40處),直至程式執行結束,windows解除對映時,"hello world"才從程序的位址空間消除。所以說,它永久存在。

char p = "hello world";

return p;

編譯器在編譯此句時,產生的**是類似於:

mov p,0x00420c40("hello world"),

即將"hello world"在程序位址空間的位址傳給p,p在getstring函式退出後不存在(這也只是在高階語言的角度,彙編中p是在棧中所已退出函式後自然不存在),而0x00420c40處的內容卻沒人能改變,因為它是唯讀的,且直接對應於.exe檔案

退回到main後再在調式器的memory察看視窗輸入這個位址(一般為0x0042....),肯定能看到hello world\0的ascii碼,注意:普通console程式,0x00120000左右的位址表示的是棧上位址,0x00400000之後的位址是.exe檔案的對映,0x7c000000左右的位址是系統dll的變數與函式

其他作業系統的實現也大同小異。總之,"hello world"在程式執行期間一直存在。

通過上面的問題以及解析,對於函式裡的字串常量,首先,它是有記憶體空間的;其次它的位址在記憶體的常量區;再次,它是唯讀的,在你打算對該記憶體區域進行寫操作時,則會出現異常,如:
char *p = 	null;
p = "strings";/*把字串的位址賦給指標p*/
*p = 's';
該段**執行時就會報錯,在vc上提示***記憶體不能為written。
void  debugsynsend(int destnode,ulong_t ulmode)

//strcpy(pctxmsg,"raisecom,syn data"); /*正常***/

pctxmsg = "hello,syn data"; /*問題***/

rc=ibcsend(tid_ibc_debug_syn_channel, destnode, tid_ibc_debug_syn_channel, ibc_msg_tm_sync | ulmode, (void*)pctxmsg, 40, 10);

ros_printf("rc=0x%lx\r\n",rc);    

ros_printf("send_test,synchronous send data %s\r\n",rc == ibc_success ? "success!":"failed!");

ibcfreemsg(pctxmsg);/*釋放記憶體*/

}這個**裡面的問題出在將字串常量的位址賦給了乙個已經指向一段動態申請的記憶體空間的指標變數,它改了指標變數pctxmsg裡面的值,其實到這裡還是沒有問題的,但是在最後的釋放記憶體時,就成了釋放常量區了,這段記憶體應該是不可以用free進行操作的,於是出現記憶體釋放問題;另外就我的應用而言,在呼叫封裝的記憶體申請介面時,會在返回的位址前面留了多申請的一段記憶體,用來儲存需要的資訊,而在執行pctxmsg = "raisecom,syn data";後,因為改變了pctxmsg的值,所以使用pctxmsg往前偏移是找不到我要用的東西的。

字串常量與字串陣列

1 對於 字串,必以 0 結尾,如果是雙引號會在它所包含內容後面自動加乙個 0 且會佔據位元組數。2 字元陣列中若不指定長度,系統會自動分配 char str1 abcde 1,字串常量 char str2 abcde 2,字元陣列,在分配位元組時會在最後加上 0 3 字串 常量的值 不能被修改 因...

常量,字串常量

對於普通變數常量 常量摺疊 是 就是在編譯器進行語法分析的時候,將常量表示式計算求值,並用求 得的值來替換表示式,放入常量表。可以算作一種編譯優化 include void main 輸出 3 2 我只是改了這個位址內容,但是e還是2,因為編譯器在優化的過程中,會把碰見的const全部以內容替換掉 ...

字串常量

1.當乙個字串常量出現於表示式中時,它的值是乙個指標常量。編譯器被這些指定字元的乙份拷貝儲存在記憶體的某個位置,並儲存乙個指向第乙個字元的指標。陣列名用於表示式中時,它的值也是指標常量 2.xyz 1 因為字串常量實際上是個常量指標,這個表示式計算 指標值加上1 的數值。它的結果是個指標,指向字串中...