首頁 > 後端開發 > C++ > 主體

為什麼 C 中指標和基於陣列的字串初始化時「strlen」和「sizeof」會傳回不同的值?

Susan Sarandon
發布: 2024-11-01 07:14:02
原創
616 人瀏覽過

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

對於基於指標和陣列的String init 的strlen 和sizeof 的不同答案[重複]

在C 程式語言中,當聲明一個數組和指向字串的指針,可以使用“strlen”和“sizeof”函數獲得不同的輸出。理解這種差異對於有效的記憶體管理和資料處理至關重要。

為了說明這種差異,請考慮以下程式碼片段:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));
登入後複製

產生的輸出將是:

7 4
7 8
登入後複製
登入後複製

「strlen」函數會傳回字串中的字元數,不包括空終止符。在這兩種情況下,字串都包含 7 個字元。另一方面,「sizeof」函數傳回記憶體中資料類型的大小。

對於指標“str1”,“sizeof(str1)”傳回指標變數本身的大小,在大多數系統上通常為 4 個位元組。這是因為「str1」不是一個數組,而只是一個指向字串「Sanjeev」的指標。

相較之下,「str2」是一個字元陣列。 'sizeof(str2)' 傳回整個陣列的大小,包括空終止符。結果,它輸出 8 個位元組:7 個位元組用於字符,1 個位元組用於空終止符。

要進一步理解這個概念,請考慮以下修改後的程式碼:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));
登入後複製

這此時,輸出將是:

7 4
7 8
登入後複製
登入後複製

即使'str1'和'str2' 引用相同的字串,'sizeof' 輸出仍然相同。這是因為「str1」仍然是一個指針,而「str2」仍然是一個陣列。兩者的“strlen”輸出都保持為 7,因為它只計算字串中的字元。

以上是為什麼 C 中指標和基於陣列的字串初始化時「strlen」和「sizeof」會傳回不同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!