【发布时间】:2020-10-10 00:32:07
【问题描述】:
我定义了一个函数:
void myFunction(char string[20])
{
// update my string here, maximal size is 20.
}
调用函数
char st[5];
myFunction(st);
是一个错误,因为myFunction 破坏了导致未定义行为的堆栈。当然st 的大小应该是 20(或更大)。
有没有办法让 c 编译器在发生此类错误时抱怨,以及编写此类调用的推荐方法是什么?
【问题讨论】:
-
知道数组长度(作为函数参数实际上是一个指针)的唯一方法是将长度作为另一个参数传递。编译器将忽略定义中的
20:它仅用于多维数组,以便编译器知道如何对其进行索引,例如char string[][20]。不破坏数组边界是 C 语言程序员的全部责任(初始化数据除外,作为数组定义的一部分)。 -
通常有帮助的方法是定义计数/长度并在任何地方使用(例如):
#define COUNT 20并执行:char st[COUNT];和void myFunction(char string[COUNT]) { for (int i = 0; i < COUNT; ++i) string[i] = ...; }。这并不完全是您所要求的,但它比在所有地方硬连线计数要好。它还允许轻松更改计数(例如#define COUNT 37)并自动调整所有位置。
标签: c arrays string definition