天天看點

細談C語言中的字元串

  對于初學者來說,C語言中對于字元串的操作稍顯複雜,而且夾雜着指針的操作,這使得程式員稍微一不小心就會出現錯誤。C語言作為低級語言和進階語言的中間題,必然比不上java中的String來的舒服。但是,C語言的優秀展現在它的效率和接近底層環境。好了,不多說了,大家先看下面這一道某IT公司的筆試題。

  #include

  #include

  void main()

  {

  char * str1="abc";

  char * str2="abc";

  const char * str3="abc";

  const char * str4="abc";

  char str5[]="abc";

  char str6[]="abc";

  char * str7=(char *)malloc(sizeof(char)*4);

  char * str8=(char *)malloc(sizeof(char)*4);

  if(str1==str2)

  printf("str1 equals to str2.\n");

  else

  printf("str1 does not equal to str2.\n");

  if(str3==str4)

  printf("str3 equals to str4.\n");

  else

  printf("str3 does not equal to str4.\n");

  if(str5==str6)

  printf("str5 equals to str6.\n");

  else

  printf("str5 does not equal to str6.\n");

  if(str7==str8)

  printf("str7 equals to str8.\n");

  else

  printf("str7 does not equal to str8.\n");

  }

  程式的運作結果如下圖所示:

  

  我們先抛開這道題,回憶一下C語言定義字元串的幾種常見的方式:

  ①char * str="abc";

  ②char str[]="abc"; ,char str[4]="abc"; ,char str[4]={'a','b','c','\0'}

  ③char * str=(char *)malloc(sizeof(char)*4);

  對于第一種方式,"abc"是常量字元串,是以它被存儲在常量區中,在程式被編譯後,str就直接指向常量區中的"abc"。再看第二種方式,str指向的記憶體空間是系統為其配置設定的棧空間,而且配置設定的時機并不是在程式編譯時,而是在程式運作時。是以,如果程式被編譯成目标檔案,第一種方式生成的目标檔案比第二種方式生成的目标檔案大。最後我們再來看第三種方式,顯然str指向的記憶體空間是在程式運作時由系統配置設定的堆空間。

  我們再回到開始的那道試題,str1和str2均指向常量區中的"abc",是以str1等于str2,str3與str4相等也是同樣的道理。而str5,str6,str7和str8均指向不同的記憶體位址,故他們各不相等。