众所周知,C中的字符串以null结尾。这是否意味着根据标准,使用NULL常量作为终止符是合法的?或者字符串的空指针和空终止符的名称相似只是一个愉快的巧合吗?
考虑代码:
char str1[] = "abc";
char str2[] = "abc";
str1[3] = NULL;
str2[3] = ' ';
在这里,我们将str1
的终止符更改为NULL。这个合法且格式良好的C代码和str1
是否符合C对空终止字符串的定义?在C++的情况下会是一样的吗?
在实践中,我总是在字符串的代码中使用NULL而不是"\0",一切都正常——但这种做法100%合法吗?
编辑:我知道这是一种非常糟糕的风格,不赞成它,现在我明白了0、NULL和"\0"之间的区别(就像在重复中一样,NULL、\0';和0之间的区别是什么)。我仍然很好奇这部法典的合法性——这里的声音似乎很混杂——在我看来,副本并没有给出权威的答案。
这是否意味着根据标准,使用NULL常量作为终止符是合法的?(操作)
str1[3] = NULL;
有时。此外:是否总是正确地导致字符数组形成字符串而不会引起任何问题?
首先,它看起来不对。与int z = 0.0;
相似。是的,它是法律上定义明确的代码,但不必要地引起人们对它本身的关注。
在实践中,我一直使用
NULL
而不是' '
(OP)
我怀疑你是否会找到任何现代风格的指南或编码团队对此表示赞同。NULL
最好是为指针上下文保留的1
这是两种常见且广为人知的替代方案。
str1[3] = ' ';
str1[3] = 0;
C中的字符串为空终止(OP)
C规范始终使用null字符,而不仅仅是null。
宏是
NULL
,它扩展到实现定义的空指针常量;和C11§7.19 3
好的,现在什么是空指针常量?
值为0的整数常量表达式,或转换为类型的此类表达式
void *
被称为空指针常数。§6.3.2.3 5
如果空指针常量是void*
,那么我们有类似的东西
str1[3] = (void*) 0;
以上内容可能会对将指针转换为char
发出警告。这是最好避免的事情。
在C++的情况下会是一样的吗?(操作)
是的,以上适用。(除此之外:str1[3] = 0
可能会发出警告。)此外,NULL
不如nullptr
更可取。因此,NULL
很少是C++中在任何上下文中使用的最佳方法。
1注意:@Joshua报告了一种与1995 Turbo C 4.5 中的OP相匹配的风格
底线是,在C/C++中,NULL
用于指针,与空字符不同,尽管两者都定义为零。根据上下文和平台的不同,您可能会使用NULL
作为null字符,但为了正确起见,请使用' '
。这在两个标准中都有描述:
-
C指定宏
NULL
被定义为<stddef.h>
中的一个宏,该宏"扩展到实现定义的空指针常量"(第7.17.3节),其本身被定义为"值为0的整数常量表达式,或转换为类型void *
的表达式"(第6.3.2.3.3节)空字符在第5.2.1.2节中定义:"一个所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。"同一节解释了