為什麼char a 2 ,a 0 good 對a 0 1 賦值會出錯?

時間 2021-05-06 21:11:11

1樓:生公尺

現在再看這個問題,其實裡面犯了很多常識性錯誤,無奈當初學習的時候腦子不好使,弄混了很多概念,當時對於paintdream的回答,也是不全理解,在掌握了二進位制逆向後,再看這個提問,就覺得簡單的不行了。

char *a[2];//這裡宣告了乙個指標陣列a,該陣列有兩個成員,在x64的作業系統裡,乙個指標佔8位元組,所以a所在位址包含了16位元組的記憶體。

a[0]="good";//此處給第乙個指標進行了賦值,將常量字串good的位址賦值給了a所在的前8位元組。在exe檔案中,這個字串是儲存在.data段。

a[1]="nice";//同上,將nice的位址賦值給了後8位元組

char b[2][2];//這裡宣告了乙個char型別的二維陣列,乙個char大小為1位元組,因此b所在位址包含了4位元組大小。

b[0][1]="good";//這個操作其實是錯誤的,b的成員是char,而不是char*指標,此處把字串位址賦值給char型別是錯誤的操作,因為你沒法讓乙個位元組存下8位元組。

再說a[0][1],它其實代表兩個操作。1,從a[0]處取出指標位址,即"good"的儲存位址;2,從good字串中索引第2個字元"o"。所以這裡的操作其實是從唯讀節區讀取字元,如果賦值,就會觸發異常,因為該字串所在位址是唯讀的,不能寫。

這也解釋了為什麼它是個常量不是變數了。

那如果想修改字串怎麼辦?

malloc一片記憶體,然後使用strcpy拷貝常量字串到陣列裡。

或者使用char str="good"來賦值,編譯器會自動識別字串長度並賦值給str指向的記憶體區域。因此修改str並不會修改到good的記憶體,而是str指向的記憶體。

2樓:fx991ESplus

a[0]=(char*)manlloc(5*sizeof(char));

strcpy(a[0],"good");這樣

3樓:

因為常量字串是唯讀的。

它不是在堆上新分配的,而是處於程式檔案的資料段或者附加資料段,隨檔案一同載入進記憶體,預設唯讀。

補充常見字串常量的一些東西:

const char* str = "abc"; // 唯讀char str = "abc"; // 會從乙個唯讀字串中將"abc"複製到str中,因此str可讀寫。

char str = ; // 會先分配str的記憶體,然後逐個填充。

2和3的寫法在大多數情況是沒有區別的,但是在寫一些shellcode的時候,如果指令存在移動或者引用唯讀字串的行為,則3的寫法能在這種情況下不出錯。

2除以0比1除以0大嗎,為什麼?

蘋果 仔細想了一下,原回答的證明其實並不對。x在 0,pi 2 時,x也是大於sinx的,但x和sinx其實是等價無窮小,1 x和1 sinx在x 0時的無窮大應該是相等的。所以應該是這樣,limx 0時,x 1 x 2 2,因此x 1的無窮小 x 2的無窮小。以下為原回答 無窮大是沒法直接比較的,...

0 除以 0 為什麼沒有結果呢?那此時 0 為什麼不能做除數呢?

冰楓的第五小號 其實關鍵在於除法的定義與實現,所以說如果在這裡我給出一種能夠除以0的實現,比如說像這個 只適用於自然數 public static operatorint int left int right if i left break if i left return newint times...

1 乘 0 為什麼等於 0?

xfl 我個人想當然地認為,那是因為人們始終相信乘法交換律就是徹底的真理。首先,我得感嘆中華文化的博大精深,中國玩文字遊戲,可謂世界之最。後面的計算全部基於十進位制 先拿除法開刀 13 5 2 3 中文讀法是 十三除以五得二餘三,或者五除十三得二餘三。我對中文這樣描述的理解是 除,即除去,刪去,去掉...