它們是一個大坑。尤其一些經常要處理string的程序上。
自己稍一忘記處理char *的要點,就落入大坑裡。
所以要記下這些重點,不能讓自己重蹈覆轍。
1. string的定義:
-char *s1=”aaaa”;-char s2[]=”bbbb”;
看上去是一樣,但實際上完全不同。分別在於data是儲存在哪。
aaaa是儲存在Data segment,只能讀不能寫,如想改變,segmentation fault!
但s1這個pointer是可變的,可指向其他地址,如當指向s2時,用它就可變bbbb的值。
s[]是儲存在stack,可讀可寫。
詳細請在這試試:http://tpcg.io/EZRqCV
所以string在C就是一個坑。
2.當String作為參數給function時,這又是一個坑。
最經典的code:void func(char pData[]){
pData="abc";
}
int main()
{
char s[]="123";
func(s);
printf("Value of s:%s\n",s);
return 0;
}
http://tpcg.io/Q8WbLk
之前,一直想,s 是pointer,是pass by reference,所以輸出一定是abc。
但是,事實並不是這樣。
C 其實跟Java一樣,所有function parameter都是pass by value。
即是parameter是原來變數的copy。
pData是s的複制品,無論pData指向哪裡,對s沒影響,s還是指向123。
另外,pData="abc";這句的意思是將pData指向另一個新地方,不在指向123。
所以,要在function內改變s中的值,pData不能亂指,要續一改變,
void func(char pData[]){
pData[0]= ‘a’;
Data[1]= ‘b’;
pData[2]= ‘c’;
}
或者用標準庫string.h裡的funciton,如strcpy,一次過copy 一串string.
沒有留言:
發佈留言