c - 当您将文字字符串作为函数中的参数传递时,C 会添加 '\0' 吗?
问题描述
例如,如果我写:
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)
就那么简单。
在编译器级别,所有字符串文字都有 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
修改的字符数组- 尝试修改指向的数据或明确未定义的行为。这种状态通常用; 通过编写,如果您尝试对其进行编辑,编译器将正确地抱怨。0x7fff2fe0
0x7fff2fe5
const
const
作为附加说明,通过编写
char[] myarr = "Hello";
您将创建一个重复的堆栈分配字符数组,名为myarr
,并且可以修改该数组。myarr
确实仍将包含\0
并具有 6 char
s 的大小,特别是myarr
将具有 type char[6]
, with sizeof(myarr) == 6
。
推荐阅读
- c# - 必填字段验证器定位 asp.net
- python - 如何使用 re.findall 查找不是全部大写字母的单词?
- ruby-on-rails - Cloudinary 只能在本地工作,不能在生产环境中工作
- angular - 如何识别与单击默认第一个元素相关的事件进入下拉菜单?
- php - 如何使用 DateTime 变量过滤过滤器自定义帖子类型
- python - Scrapy - 为项目中的特定蜘蛛(而不是其他蜘蛛)使用提要导出器
- javascript - res.locals,req.variable 在 node.js 中返回 undefined
- rust - Vec::dedup 不起作用 - 如何从字符向量中过滤重复项?
- ruby-on-rails - 数组在另一个数组中出现了多少次?
- javascript - 为作为参数传递给Javascript函数的对象分配别名