C語言中用指標宣告字串在部分系統下執行有問題?

時間 2021-06-07 16:41:03

1樓:

執行報錯很正常,在windows下如果你用vc編譯的話也會執行報錯,因為這是已初始化的資料,被放在所謂的靜態儲存區,預設在PE檔案的.rdata區段,這個區段是可讀取不可寫入的,寫入肯定會非法訪問。

可以根據@余天公升的方法將字串放在棧裡,但是如果你一定要這麼做的話,那就在加上#pragma comment(linker, "/section:.rdata,RW")以通知鏈結器將.rdata區段的屬性設定為可讀取可寫入就ok了。

2樓:

你對字串賦值的理解有一些問題,且str[0]='F';這個賦值並不合法。char *str="Hello World";宣告的是乙個字串常量,指標變數str指向"Hello World"這個字串的位址。那麼很顯然str[0]指向的是字串常量的第乙個字元的位址,由於這個字串是個常量,因此企圖用字元'F'替代'H'是不合法的。

如果希望用字串"F"替代「Hello World」,只需要用如下方法賦值:

str = "F";

如果以char str[20] = "Hello World";的方式宣告str,則str是常指標,即無法使用上述語句對str賦值,但str[0]='F';合法,因為此時str是個字元陣列,在語義上和char * str不同。注意這些微妙的區別。

能在TC下編譯並執行通過只能說明這個TC編譯器未嚴格遵照ANSI C標準,gcc的結果是正確的。

3樓:余天公升

這樣寫就是不對的。那個字串是乙個常量,常量在記憶體裡面專門分配一片空間,是不應當被修改的。如果你按照下面的方法宣告,就不會有問題。

char str[20] = "Hello world";

C語言中,字串常量為什麼只能給字元陣列初始化,而不能通過指標賦值

程佳 陣列是指標常量,常量不能賦值。字串在c語言裡不是原生資料型別,就是乙個內容非0結尾為0的位元組陣列。所以對字串的操作要使用string.h裡那些庫函式。 神念的經 想啥呢,一旦定義成了靜態陣列,首元素位址就是定死的。想改位址?門都沒有。指標賦值?那是改指向的位址,不是改指向的內容。strcpy...

C 語言中如何優雅地拼接多段字串?

湛藍水晶 用sprintf strcat在設計之初是考慮了鏈式呼叫的,所以返回的是源位址,於是可以用 strcat strcat strcat strcat strcat strcat strcat strcat dest TEST1 ip TEST2 port TEST3 name TEST4 n...

C語言字串長度函式?

C語言答疑課堂 題主的問題有兩個地方需要回答 1.為什麼寫 c 100 會報錯?你看啊,陣列c定義的時候指定大小是100,這可不是意味著從1 100,而是0 99,C語言數字下標是從0開始的。對於我們來說,是不是有點不習慣?c 100 意味著第101個元素,這個元素並不在陣列裡,鬼才知道你是個什麼東...