函数参数作为具有声明大小的数组
Function parameter as array with declared size
我经常使用以下约定来通知客户端代码一个函数需要一个定义大小的数组参数:
/* File foo.h */
int foo (int arg[10]);
我想向客户代码传达的信息是,他们必须提供具有 10 个位置的 int
类型的数组。
我知道这不是很常见,所以我来这里问:我是否遗漏了这个约定的任何副作用?无论如何有害吗?
谢谢!
这样写也无妨。但请注意,编译器不会强制执行该要求。编译器会像您编写的那样对待这样的声明。
int foo(int *arg);
struct arrayContainerTen{
int data[10];
}
void aFunction(struct arrayContainerTen *pAnArray)
{
size_t size = sizeof(pAnArray->data);
}
main()
{
arrayContainerTen anArray;
aFunction(&anArray);
}
如果你想坚持得到一个大小为10的数组,你可以使用:
int foo (int (*arg)[10]);
这样做的副作用是:
在函数中,你必须使用:
(*arg)[index]
而不仅仅是
arg[index]
调用函数必须使用:
int array[10];
foo(&array);
而不是
int array[10];
foo(array);
不能使用超过 10 个元素的数组。
int array[20];
foo(&array); // Not OK.
您不能使用 malloc
ed 数组。
int* array = malloc(sizeof(int)*10);
foo(array); // Not OK.
现在选择危害最小的解决方案。
我经常使用以下约定来通知客户端代码一个函数需要一个定义大小的数组参数:
/* File foo.h */
int foo (int arg[10]);
我想向客户代码传达的信息是,他们必须提供具有 10 个位置的 int
类型的数组。
我知道这不是很常见,所以我来这里问:我是否遗漏了这个约定的任何副作用?无论如何有害吗?
谢谢!
这样写也无妨。但请注意,编译器不会强制执行该要求。编译器会像您编写的那样对待这样的声明。
int foo(int *arg);
struct arrayContainerTen{
int data[10];
}
void aFunction(struct arrayContainerTen *pAnArray)
{
size_t size = sizeof(pAnArray->data);
}
main()
{
arrayContainerTen anArray;
aFunction(&anArray);
}
如果你想坚持得到一个大小为10的数组,你可以使用:
int foo (int (*arg)[10]);
这样做的副作用是:
在函数中,你必须使用:
(*arg)[index]
而不仅仅是
arg[index]
调用函数必须使用:
int array[10]; foo(&array);
而不是
int array[10]; foo(array);
不能使用超过 10 个元素的数组。
int array[20]; foo(&array); // Not OK.
您不能使用
malloc
ed 数组。int* array = malloc(sizeof(int)*10); foo(array); // Not OK.
现在选择危害最小的解决方案。