![](/img/trans.png)
[英]Pass string literal as the argument to the print function with out any format specifier?
[英]Does C add '\0' when you pass a literal string as an argument in a function?
例如,如果我寫:
void function(char *k){ printf("%s",k);}
並這樣稱呼它:
function("hello");
代碼是否將該字符串轉換為: "hello\\0" ? 或者我是必須添加它的人?
在 C(和 C++)中,當你做const char* mystr = "Hello";
,編譯器將在(只讀)RAM 中生成以下內容:
0x7fff2fe0: 'H'
0x7fff2fe1: 'e'
0x7fff2fe2: 'l'
0x7fff2fe3: 'l'
0x7fff2fe4: 'o'
0x7fff2fe5: '\0'
然后,編譯器將替換
const char* mystr = "Hello";
和
const char* mystr = 0x7fff2fe0;
對於您的使用,您的代碼將變成
function(0x7fff2fe0)
就那么簡單。
在編譯器級別,所有字符串文字都具有const char[N]
類型,其中 char 數組是一個包含所有寫入字符的數組,后跟一個\\0
。 char[N]
的長度N
是 1 + 您編寫的字符串的長度( char[6]
表示"Hello"
)。 可以在此處找到更多信息,他們還以字符串“Hello”為例。 因此, sizeof("Hello") == 6
和"Hello"[5] == '\\0'
(是的, "Hello"[5]
是合法的,記住, "Hello"
類型是const char[6]
) . 我們在以下示例中看到此信息:
printf("%d\n", sizeof("Hello")); // 6
const char[] str = "Hello"; // Casts from const char[6] to const char[6]
// Resulting in a copy of all 6 bytes
printf("%d\n", sizeof(str)); // 6
const char* str2 = "Hello"; // Casts from const char[6] to const char*
printf("%d\n", sizeof(str2)); // 4 on a 32bit system, 8 on a 64bit system
請注意,在轉換為指針時,您會得到一些指針,例如0x7fff2fe0
指向不可修改的字符數組 - 嘗試修改指向0x7fff2fe0
或0x7fff2fe5
的數據是明確未定義的行為。 這種狀態通常用const
表示; 通過編寫const
,如果您嘗試編輯它,編譯器將正確地抱怨。
作為附加說明,通過寫
char[] myarr = "Hello";
您將創建一個名為myarr
的重復堆棧分配字符數組,並且可以修改該數組。 myarr
確實仍將包含\\0
並且大小為 6 char
s,特別是myarr
將具有類型char[6]
, sizeof(myarr) == 6
。
來自C11 標准第 6.4.5 節字符串文字,第 6 段(第 71 頁):
在轉換階段 7 中,將一個字節或值為零的代碼附加到由一個或多個字符串文字產生的每個多字節字符序列。 78) 然后使用多字節字符序列初始化一個靜態存儲持續時間和長度剛好足以包含該序列的數組
字符串文字本身已經包含一個終止\\0
,無論您如何處理該文字。 "hello"
始終是h
、 e
、 l
、 l
、 o
和\\0
的char [6]
數組。 因此,您“將其傳遞給函數”這一事實在這里完全無關緊要。
沒有必要添加任何東西。
字符串文字不會傳遞給函數,只有指向第一個字符的指針。 引用的對象將具有所有字符 + 終止零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.