2018年1月24日星期三

C srtings,char *的哪些事

strings在C上是比較特別的存在,時時都忘了它們的特性而花很多時間去debug。
它們是一個大坑。尤其一些經常要處理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.


沒有留言:

發佈留言