在字符数组末尾使用\0的安全性问题

5
我正在为运行定制版本的修改后的Linux的嵌入式系统编写驱动程序(它是一个手持扫描仪)。制造商提供了一个自定义的Eclipse Juno发行版,其中包含一些库和示例。

我从串口接收到的输出以标准字符数组的形式呈现。我正在使用数组中的单个字符传递信息(错误ID和错误代码),如下所示:

if (tmp[i] == 250])

这里的tmp是一个字符数组,形式为char tmp[500];,首先初始化为0,然后用来存储来自串口的输入。

我的问题是:

假设我要遍历数组中的每个元素,在数组末尾之前的任何位置使用0(例如\0),是否安全?假设我:

  1. 不将其视为字符串(通过遍历并像int数组一样使用它)
  2. 知道其中会有什么内容以及在其中间出现的随机\0应该表示什么。

我之所以问这个问题,是因为我有几个同事告诉我,无论情况如何,都不应该在字符数组中包含\0,即使在末尾之前也不行。

目前我的代码可以正常运行,但我不确定它是否会在以后引起问题。

重写代码以避免这种行为将是一个不小的工作量。


1
我觉得只要不使用字符串函数(如 strcpystrcat 等),就应该没有问题。 - Mr. E
1
我认为你的主要问题可能与 tmp[i] == 250 这样的语句有关。如果 tmp 是一个 char 类型,那么它是有符号还是无符号是未定义的。如果它是有符号的,那么这个语句永远不可能成立,因为它必须在 -128 和 127 之间。 - Tom Tanner
@TomTanner 给定 char 始终是无符号的。 - Magisch
没问题。我可能会使用signed charunsigned char,而不是char,以表明它不应被视为字符串。 - pmg
1个回答

7

使用字符数组作为小整数数组是完全可以的。但是要小心不要将其传递给任何期望“字符串”的函数。

如果您想更明确地表达它,并确保该数组使用的是unsigned char,则可以改用uint8_t


我不能决定数组的类型。我使用制造商函数来检索数据,它期望是一个字符数组。我不确定将其转换为其他类型是否会对其造成损害。 - Magisch
@Magisch,将其保留为char数组是无害的,只要您意识到其限制(没有字符串函数),并且还为代码的未来读者/用户记录它。 - Some programmer dude
好的,谢谢你的断言。(我的同事通常也会参考SO作为指导,所以将它们链接到这里会有所帮助) - Magisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接