char aabc ,為什麼修改常量沒錯誤,有圖

2022-07-12 07:25:02 字數 3263 閱讀 8538

1樓:陽光上的橋

c語言是很奇怪了,與不同的作業系統、cpu工作方式不同,因為不同架構系統的定址方式、實現方式都不一樣,dos下沒有段保護,可以修改。你用的平台有保護、無法修改、但不報錯。unix平台下不允許修改,直接報錯。

在turbo c上執行的情況:

abcgbc

在小型機上執行的情況:

$ cat a.c

#include

main()

$ cc a.c

$ a.out

abcmemory fault(coredump)

2樓:匿名使用者

你好,這是沒有問題的

a只儲存了那個字串的位址,a[0]=`g'是儲存不到字串中的,看你的輸出結果也就明白了。字串儲存在了常量區肯定是不能被修改的。把字串放在陣列中,你再這樣做就會報錯

望選為滿意答案

3樓:春鴿活在當下

親,char *a這句話只申請了乙個指標,而沒有為該指標分配記憶體,所以後面的東西是存不進去的,第一句應該這樣寫char a="abc";這樣就沒有問題了

4樓:眼眶的濕潤

你沒有報錯其實是和編譯器有關的,我在vc下執行就報錯了。

c++問題,char*p="abc";為什麼可以進行,abc是字串常量,p是非常量位址,為什麼可

5樓:匿名使用者

c++的話,現在已經不可以了。但是要讓編譯器服從新規定,需要的工作不小。比如說gcc編譯器雖然現在已經可以對 char*p="abc"; 報錯,但是在比較微妙的地方還是沒有處理好

以前(上個世紀)c++確實是允許 char*p="abc"; 這樣的寫法的,理由是歷史原因:

· 最早的

c 語言實際上允許修改字串字面量,在那個時候(上個世紀七八十年代) char*p="abc"; p[2] = 's'; 是允許的。當時也沒有

const 關鍵字:const 關鍵字是 c++ 引入的,後來又被c語言吸收。這樣一來 "abc" 這樣的字串字面量的型別是 char[4]

,它可以隱式轉換為 char* 型別——這樣的話就沒辦法禁止寫 char*p="abc"; 。

· 之後 c++ 引入了 const,之後 ansi c 吸收了 const 這一關鍵字, ansi c 也禁止了修改字串字面量。但是不可能讓使用者在一瞬間立即放棄過去的所有**,所以暫時沒有改變字串字面量的型別,"abc" 這個字串字面量的型別還是 char [4]

· 當時 c++ 大概是照抄了 c 語言的規定,認為 "abc" 這樣的字串字面量的型別還是 char [4]

· 在 1996 年(這個能說出準確年份,因為在 c++ 標準委員會的官方**上還能找到提案),有人向標準委員會提議改變字串字面量的型別,從 char 陣列(array of char)變為 const char 陣列(array of const char),當時的過程外人自然無法了解,但結果是在c++國際標準 iso/iec 14882:1998 (這個版本的標準俗稱 c++98)裡面,字串字面量的型別確實是 array of const char。但是為了相容以前的**, c++98 還規定字串字面量可以隱式轉換到 char* 型別,並且 c++98 還表示,這個轉換是廢棄的(deprecated),說不定下一版標準就不能用了——嗯,這個轉換就是特例

之後,c++國際標準 iso/iec 14882:2011 就刪掉了這個隱式轉換

所以現在 char* p = "abc"; 應該是不合法的

6樓:喵不語

」abc」返回的就是字串abc在記憶體中的位址,指標p儲存位址沒問題啊!

7樓:匿名使用者

對,他說的對,我也是這麼想的

char *a;a="abc"與char*a;*a="abc"char *a="abc"有什麼區別嗎?

8樓:

char *a;

a = "abc";

和char *a;

*a = "abc";

作用相同 就是將字串陣列的首位址給char 指標變數a(假設16位位址值,要被截斷成8位

char *a =「abc」 可以看作是 char a="abc";

9樓:太叔青芬俞環

不行p1沒有初始化(也就是常說的野指標),它指向的空間是未知的先初始化:

p1=char(**)malloc(10*sizeof(char*));

//分配10個char*的空間

p1[0]=(char*)malloc(sizeof(a));

//給p1[0]分配合適空間

strcpy(p1[0],p)

//現在可以了

char a 和 char *a 有什麼區別? 例如我用 char a = 33 就沒問題 但是char *a = 33 就報錯了?

10樓:金色潛鳥

宣告 char a; 宣告 a 是 char 型變數,char 型變數 是 1 位元組 整型。

宣告 char *a; 宣告 a 是 指標,用於 指向 char 型變數, 指標用於存放指向的變數的位址。

宣告 char *a = 「abc」是宣告和初始化,這裡用字串常量做初始化,這是允許的。

宣告 char *a = 33 是錯誤的,因為 33 是整型常量,不是字串。

語句 printf(「%s」,*a) 是錯誤的, 同樣的外形 *a, 在宣告中的意思 和 在 語句 裡的意思不同(這是c/c++自己的規則-- 形式邏輯不成立),要輸出 字串 要用 printf(「%s」,a)。

char*的區別和轉換

char*a=「aaa」是不對的,但是const char*a=「aaa」就是對的?為什麼?

11樓:匿名使用者

也不能說他不對,因為你就算這麼宣告依舊是能通過的但問題是

char * a = "aaa";會使你在後續可能出現a[2] = 'b';這樣的**而編譯器不會報錯,事實上「aaa」是乙個常量,不允許修改的,一旦改動程式會報錯

如果const char * a = "aaa"; 這樣宣告的話當你試圖去修改a指向的區域,編譯器就會提示lvalue錯誤(左值必須為可修改的值)

這樣就可以避免誤操作導致的程式崩潰

12樓:匿名使用者

這倆等價啊,字串常量

c語言裡面的字串常量和字元常量有什麼區別

字串常量是乙個或多個字元組成的常量 比方說 乙個字串常量a 給它的初始值是 abc123 可以是乙個字元 5 構成 但是字元常量只能是乙個字元 比方說乙個字元常量 a 它的初始值為 1 不能多於乙個字元的 字串是以 0結束的 而字元常量是沒有的 字串常量和字元常量有什麼區別就是多個字元和單個字元的區...

男生15歲為什麼平常量身高165而早上剛起床量卻有167然後過了幾個小時又縮回去了

男生15歲為什麼平常量身高165而早上剛起床量卻有167然後過了幾個小時又縮回去了 熱脹冷縮了!普通人一天中早晨是身高最高的時候,而晚上是最矮的。這之中相差有1cm左右,原因是脊柱的拉伸和壓縮。通俗點說,在床上休息時,人體的脊柱之間的環開啟,而經過一天站立後重又合攏,這是很正常的現象。不過2cm未免...

c語言中為什麼用巨集定義字元常量字母可以賦值給字元

1 因為巨集定義實質是一種替換,雖然看起來是字元,實際上最終是被替換成其他常熟或者值。2 巨集定義中的識別符號都採用大寫,這是程式設計中一種約定俗成的習慣 1 巨集替換不做語法檢查,所以在使用的時候要格外小心2 巨集替換通常在檔案開頭部分,寫在函式的花括號外邊,作用域為其後的程式,直到用 問好 3 ...