C語言字串的那些事兒

2021-06-26 10:11:26 字數 1496 閱讀 5792

c語言中,字串的使用對於初學者來說是個很容易混淆、很容易出錯。c語言字串是以『\0′結尾。因此,我們使用字串時,始終要記得留乙個位元組用於存放結尾符。

請看下面一段**,哪個地方會在執行時出錯?

1

2

3

4

5

6

char

str1

="hello,world"

; char

str2

[100]=

"hello,world"

; char

*str3

="hello,world"

; str1[0

]='h';

str3[0

]='h';

printf

(" %s   %s  %s"

,str1

,str2

,str3);

上面的**會在如下地方出錯。 1

str3[0

]='h';

從概念上講,之所以出錯是因為str3是個常量字串,而常量是不允許被改變的。

在一些開源專案中,我們能看到c語言字串的一些引申版本,他們對c語言原生字串進行封裝以獲得額外的優點。例如:

nginx中字串型別被定義為乙個結構體,如下:

1

2

3

4

typedef

struct

ngx_str_t

;

這樣定義有什麼好處呢?

nginx針對web伺服器特定的場景對字串進行的乙個簡單封裝。這樣封裝的好處是可以有效的降低記憶體使用量。

例如:假設如下乙個http請求存放在起始位址為0×12345678的記憶體處。

我們要取出http請求的請求方法,只需要如下賦值即可獲得,而不需要額外開闢記憶體空間來儲存。這樣就節省了記憶體。 1

2

len=3

; data

=0x12345678

在redis中,字串同樣也被封裝成了乙個結構體,具體如下: 1

2

3

4

5

struct

sdsdr;

redis總將字串封裝成如上結構,你能看出它相比於原生字串,有什麼好處麼??

至少有如下幾個好處:

1)能夠在o(1)時間內獲取到字串的長度。而原生字串要獲取器長度擇需要通過檢測字串結尾符才能得到字串長度,時間複雜度為o(n)

2)能夠有效杜絕緩衝區溢位。這個很好理解,比如c語言字串複製操作,如果如果事先沒有分配足夠的記憶體,便會出現快取區溢位。而有了len這個欄位後,我們可以利用它來防止快取區溢位。

C語言字串那些事兒

字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾。其中nul是人為定義用作字串結尾的標誌,所以字串的長度不包括nul位元組。nul位元組其實就是ascii碼為0的數。例 char line world0 則在gdb除錯發現 gdb x 7d line 0x8048470 1191...

關於字串的那些事兒

字串,大家都是知道的,但是儲存它的手段卻有很多,不管是char 陣列還是string抑或是 vector,或者這三者的指標都是可以的。那麼我們如何正確的使用它們呢?我通過乙個小專案,期間遇到各種的問題,現在稍微有些眉目。現在記錄一下,以便以後使用,也為大家略盡綿薄之力。char str1 15 ab...

C語言那些事兒

專案名稱 蘇嵌實訓 嵌入式linuxc第3天 今日進度以及任務 學習了c語言的基本知識 本日任務完成情況 掌握了c語言的基本知識 本日開發 現的問題彙總 c語言中的細節問題要注意 本日未解決的問題 無本日開發收穫 進一步熟悉了c語言其他無 c語言1 c語言之父?丹尼斯里奇 2 c的特點 優勢 語言標...