2013-02-09 131 views
0
int main() 
    { 
     char *ch="girl"; 
     int x=strlen(ch); 
     *ch=ch[x]; 
     printf("%c",*ch); 
     getch(); 
     return 0; 
    } 

爲NULL指向字符的指針時,爲什麼會出現運行時錯誤?指針和字符串

+6

它是未定義的行爲來修改字符串文字。 – 2013-02-09 12:53:45

+1

如果你想要打印字符串的最後一個字符,你應該把'* ch = ch [x]'改成'* ch = ch [x-1]' – 2013-02-09 12:54:23

+0

考慮在這種情況下使用'const' ..當聲明它作爲一個'const',你會得到一個'編譯錯誤',這比'運行時錯誤'更好**。 – Maroun 2013-02-09 13:16:03

回答

1

UPDATE:感謝@dreamlax

"girl"被隱含聲明爲char *。但是很可能你的編譯器會把字符串放到一個部分(rostrings)中,這些部分稍後會被放置在受保護的存儲區域中。當你嘗試分配*ch的東西時,它會訪問這個受保護的(或不依賴於你的平臺)內存。

編譯器應警告您有關char *ch = "girl";

+1

「女孩」的類型是char [5]而不是'const char *'。 – dreamlax 2013-02-09 12:59:12

+0

那麼爲什麼iam因爲處於邊界之內而出現運行時錯誤? – 2013-02-09 13:01:24

+0

因爲您的平臺將字符串文字放在受保護/只讀內存中。 – 2013-02-09 13:03:07

-1

int x=strlen(ch); //x=4 
*ch=ch[x]; //you are out of bounds of array, because first element is 0, so last is 3 
+4

沒有數組,它是一個字符串字面值,'ch [strlen(ch)]'不超出範圍:它在最後引用零字節。 – 2013-02-09 12:56:41

2

更換

char *ch = "girl" 

char ch[] = "girl" 

其中前者創建一個指向不可變的存儲器,後者創建了一個char[]數組大小合適的和用「女孩」的字母(包括終止零字節)初始化它。

+0

所以,如果我只是聲明爲char * ch,它會被內部視爲一個字符的常量指針嗎? – 2013-02-09 13:12:27

+1

我想你在問什麼'char * ch =「girl」'的意思。指針的類型爲'char *',因此如果嘗試通過它修改數據,則不會出現編譯時錯誤。但是在運行時,如果您這樣做並且指針不指向可變內存,則它是未定義的行爲。就像'ch'爲NULL或指向釋放內存一樣。 – 2013-02-09 13:16:51

+0

我可以得到一個更具體的答案,爲什麼創建一個指針會使內存不可變,而不是數組? – 2013-02-09 13:28:01