int main()
{
char *ch="girl";
int x=strlen(ch);
*ch=ch[x];
printf("%c",*ch);
getch();
return 0;
}
爲NULL指向字符的指針時,爲什麼會出現運行時錯誤?指針和字符串
int main()
{
char *ch="girl";
int x=strlen(ch);
*ch=ch[x];
printf("%c",*ch);
getch();
return 0;
}
爲NULL指向字符的指針時,爲什麼會出現運行時錯誤?指針和字符串
UPDATE:感謝@dreamlax
"girl"
被隱含聲明爲char *
。但是很可能你的編譯器會把字符串放到一個部分(rostrings)中,這些部分稍後會被放置在受保護的存儲區域中。當你嘗試分配*ch
的東西時,它會訪問這個受保護的(或不依賴於你的平臺)內存。
編譯器應警告您有關char *ch = "girl";
。
「女孩」的類型是char [5]而不是'const char *'。 – dreamlax 2013-02-09 12:59:12
那麼爲什麼iam因爲處於邊界之內而出現運行時錯誤? – 2013-02-09 13:01:24
因爲您的平臺將字符串文字放在受保護/只讀內存中。 – 2013-02-09 13:03:07
這
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
沒有數組,它是一個字符串字面值,'ch [strlen(ch)]'不超出範圍:它在最後引用零字節。 – 2013-02-09 12:56:41
更換
char *ch = "girl"
與
char ch[] = "girl"
其中前者創建一個指向不可變的存儲器,後者創建了一個char[]
數組大小合適的和用「女孩」的字母(包括終止零字節)初始化它。
所以,如果我只是聲明爲char * ch,它會被內部視爲一個字符的常量指針嗎? – 2013-02-09 13:12:27
我想你在問什麼'char * ch =「girl」'的意思。指針的類型爲'char *',因此如果嘗試通過它修改數據,則不會出現編譯時錯誤。但是在運行時,如果您這樣做並且指針不指向可變內存,則它是未定義的行爲。就像'ch'爲NULL或指向釋放內存一樣。 – 2013-02-09 13:16:51
我可以得到一個更具體的答案,爲什麼創建一個指針會使內存不可變,而不是數組? – 2013-02-09 13:28:01
它是未定義的行爲來修改字符串文字。 – 2013-02-09 12:53:45
如果你想要打印字符串的最後一個字符,你應該把'* ch = ch [x]'改成'* ch = ch [x-1]' – 2013-02-09 12:54:23
考慮在這種情況下使用'const' ..當聲明它作爲一個'const',你會得到一個'編譯錯誤',這比'運行時錯誤'更好**。 – Maroun 2013-02-09 13:16:03