首页 > 解决方案 > 当您将文字字符串作为函数中的参数传递时,C 会添加 '\0' 吗?

问题描述

例如,如果我写:

void function(char *k){ printf("%s",k);}

并这样称呼它:

function("hello");

代码是否将该字符串转换为: "hello\0" ?还是我是必须添加它的人?

标签: cstring

解决方案


在 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)

就那么简单。

在编译器级别,所有字符串文字都有 type const char[N],其中 char 数组是一个包含所有写入字符的数组,后跟一个\0. 的char[N]长度N为 1 + 您编写的字符串的长度(char[6]for "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修改的字符数组- 尝试修改指向的数据或明确未定义的行为。这种状态通常用; 通过编写,如果您尝试对其进行编辑,编译器将正确地抱怨。0x7fff2fe00x7fff2fe5constconst

作为附加说明,通过编写

char[] myarr = "Hello";

您将创建一个重复的堆栈分配字符数组,名为myarr,并且可以修改该数组。myarr确实仍将包含\0并具有 6 chars 的大小,特别是myarr将具有 type char[6], with sizeof(myarr) == 6


推荐阅读