簡體   English   中英

當您在函數中將文字字符串作為參數傳遞時,C 是否添加了 '\\0'?

[英]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指向不可修改的字符數組 - 嘗試修改指向0x7fff2fe00x7fff2fe5的數據是明確未定義的行為。 這種狀態通常用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"始終是hello\\0char [6]數組。 因此,您“將其傳遞給函數”這一事實在這里完全無關緊要。

沒有必要添加任何東西。

字符串文字不會傳遞給函數,只有指向第一個字符的指針。 引用的對象將具有所有字符 + 終止零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM