将 NULL 与 C 的字符* 字符串一起使用



众所周知,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的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。"同一节解释了将是该空字符的表示。

  • C++也有同样的区别。根据C++标准的4.10.1节:"空指针常量是值为零的整数文字(2.13.2)或类型为std::nullptr_t的prvalue。"在2.3.3节中,它将其描述为"空字符(分别为空宽字符),其值为0"。C.5.2节进一步证实,C++将NULL视为从C标准库导入的标准宏。

不,我不认为这是严格合法的。

NULL被指定为:

  • 具有值的整数常量表达式​0​
  • 将值CCD_ 26转换为类型CCD_

在使用第一种格式的实现中,将其用作字符串终止符将起作用。

但是,在使用第二种格式的实现中,它不能保证工作。您正在将指针类型转换为整数类型,其结果取决于实现。在常见的实现中,它恰好可以做你想做的事情,但没有什么需要它

如果你有第二种类型的实现,你可能会得到这样的警告:

警告:不兼容的整数转换指针从"void*"分配给"char"[-Wint conversion]

如果你想使用宏,你可以定义:

#define NUL ''

然后使用CCD_ 28而不是CCD_。这与ASCII空字符的官方名称相匹配。

相关内容

  • 没有找到相关文章

最新更新