char*s = “hello world” 是不是字符串?


  用C/C++的老鐵們可能對這個都比較熟悉。char* s = "Hello World";這樣定義字符串很簡單呀,很方便。不用去考慮大小呀什么的,簡單快捷。是,這樣子是挺方便,而且編譯也不會報錯會通過,程序也能跑,但是實際上,這樣子做是不好的,嚴格意義上來講,這樣其實是定義了一個野指針。下面我們就用一段代碼來闡述這件事情。

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6 
 7     char* s = "hello world";
 8     char* s1 = "hello world";
 9     printf("s = %s\n", s);
10     printf("s1 = %s\n", s1);
11     printf("addr_s = %p\n", s);
12     printf("addr_s1 = %p\n", s1);
13 }

  我們按照這種方式定義了兩個“字符串”,我們通過printf函數看一下這個字符串能否正常的輸出,並且我們也看一下s和s1在內存中的地址。

  

  最終我們看到雖然程序報了兩個warning,但是程序依然可以繼續運行。通過程序的輸出我們可以看到,s和s1都能夠正常的輸出我們想要的hello world字符串。但是有一個地方值得注意,s和s1擁有着相同的地址。那么是不是所有的字符串都是這樣的呢,我們換一種方式去定義。

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6 
 7     char* s = "hello world";
 8     char* s1 = "hello world";
 9     printf("s = %s\n", s);
10     printf("s1 = %s\n", s1);
11     printf("addr_s = %p\n", s);
12     printf("addr_s1 = %p\n", s1);
13     char s2[12] = "hello world";
14     char s3[12] = "hello world";
15     printf("s2 = %s\n", s2);
16     printf("s3 = %s\n", s3);
17     printf("addr_s2 = %p\n", s2);
18     printf("addr_s3 = %p\n", s3);
19     
20 }

  我們通過數組的形式又去定義了兩個字符串,這下我們再去看一下程序的輸出。

  

  我們看到,這次s2和s3並沒具有相同的地址,而且值得注意的是,s、s1和s2、s3的內存地址相差較大。這是為什么呢?其實這是因為char* s = "hello world",這個操作是操作系統幫你完成的。本事char*s是一個野指針,我們並不知到“hello world”這個內容在哪,但是卻讓一個指針去指向它。那么不知道該指向誰的指針要怎么做呢?操作系統就會在特定的一個區域去幫它創建出這樣的一塊內存去存放“hello world”然后讓這個指針去指向它。而且這塊特殊的內存並不是屬於程序本身的,而是屬於操作系統的,那么這樣就會造成你只可以去讀這塊區域,他不會允許你去修改這一塊區域。這就是操作系統的保護機制,任何操作系統都是這樣。

  所以我們在定義字符串的時候就要有所考慮,什么時候用char* s 這樣的字符串,什么時候用char s[12]這樣的字符串。簡單的說,如果你只是定義了一個字符串,后來並不會對他進行一些操作,那么你可以用這種char* s形式字符串,或者你想定義一個函數去接收一個字符串類型的參數也可以用這種字符串。如果想要后續的對字符串進行大量的操作,最好用數組類型的字符串,因為它不會去占用系統的內存,這樣你就對這個字符串擁有了相對較高的權限。

  所以char* s是一個字符串,只不過是一種權限比較低的字符串,它的使用並不安全,也並不完美——因為相同的字符串會占用同一個內存地址,所以在使用的過程中要多加考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM