区分字符串和字节数组?

Mui*_*uis 6 c string gcc c99 buffer-overflow

我有很多函数需要一个字符串作为参数,我使用它char*,但我所有期望字节数组的函数也使用char*.

问题是我很容易犯错误,在字符串函数中传递一个字节数组,导致各种溢出,因为无法找到空终止符.

这通常如何解决?我可以想象改变我的所有字节数组函数uint8_t,然后编译器会在传递字符串时发出有关signed-ness的警告.或者这里的正确方法是什么?

Jen*_*edt 1

这个问题在 C 中比你想象的更普遍。由于char*char[]对于函数参数来说是等价的,因此这样的参数可能指三个不同的语义概念:

  • 一个对象上的指针char(这是指针类型的“官方”定义)
  • 一个char数组
  • 一个字符串

在大多数情况下,C 标准中的现代接口可能使用void*非类型化字节数组,并且您应该遵守该约定,并且char*仅用于字符串。

char[]单独使用可能很少;我无法想象这些的很多用例。如果您将它们视为数字,则应该使用signedunsigned变体,如果您将它们视为位模式,则unsigned char应该选择。

如果您确实将数组作为函数参数(char或不是),您可以通过清楚地指示它来为代码的临时读者标记这一事实:

void toto(size_t n, char A[const n]);
Run Code Online (Sandbox Code Playgroud)

这相当于

void toto(size_t n, char *const A);
Run Code Online (Sandbox Code Playgroud)

但让你的意图更清晰。将来甚至可能会有工具为您进行边界检查。