首先來個小例子。寫strcpy時的一個小錯誤。代碼如下:
void mystrcpy(char* ch1,char* ch2)
{
for (int i=0;ch2[i]!='\0';i++)
{
ch1[i]=ch2[i];
}
ch1[i+1]='\0';
}
最後那個i+1就不用了,直接用i。忘記i已經在循環里加過了。
順便問一下,用這種方式爲什麼也能正常打印:
void mystrcpy(char* ch1,char* ch2)
{int i=0;
while((ch1[i]=ch2[i])!='\0'){i++;}
}
這種方式沒看到在那裏加'\0'結束啊。看到的希望可以指教指教。
- 以字符串形式出現的,編譯器都會爲該字符串自動添加一個0作爲結束符,如在代碼中寫
- "abc",那麼編譯器幫你存儲的是"abc\0"
- "abc"是常量嗎?答案是有時是,有時不是。
- 不是常量的情況:"abc"作爲字符數組初始值的時候就不是,如 char str[] = "abc";
- 因爲定義的是一個字符數組,所以就相當於定義了一些空間來存放"abc",而又因爲
- 字符數組就是把字符一個一個地存放的,所以編譯器把這個語句解析爲
- char str[3] = {'a','b','c'};
- 又根據上面的總結1,所以char str[] = "abc";的最終結果是
- char str[4] = {'a','b','c','\0'};
- 還有,如果char str[] = "abc";是在函數內部寫的話,那麼這裏
- 的"abc\0"因爲不是常量,所以應該被放在棧上。
- 是常量的情況: 把"abc"賦給一個字符指針變量時,如 char* ptr = "abc";
- 因爲定義的是一個普通指針,並沒有定義空間來存放"abc",所以編譯器得幫我們
- 找地方來放"abc",顯然,把這裏的"abc"當成常量並把它放到程序的常量區是編譯器
- 最合適的選擇。所以儘管ptr的類型不是const char*,並且ptr[0] = 'x';也能編譯
- 通過,但是執行ptr[0] = 'x';就會發生運行時異常,因爲這個語句試圖去修改程序
- 常量區中的東西。
- char* ptr = "abc";這種寫法原來在c++標準中是不允許的,
- 但是因爲這種寫法在c中實在是太多了,爲了兼容c,不允許也得允許。雖然允許,
- 但是建議的寫法應該是const char* ptr = "abc";這樣如果後面寫ptr[0] = 'x'的
- 話編譯器就不會讓它編譯通過,也就避免了上面說的運行時異常。
- 又擴展一下,如果char* ptr = "abc";寫在函數體內,那麼雖然這裏的"abc\0"被
- 放在常量區中,但是ptr本身只是一個普通的指針變量,所以ptr是被放在棧上的,
- 只不過是它所指向的東西被放在常量區罷了。