考虑以下代码:
#define MAX_COUNT 4
static int foo(int w[MAX_COUNT])
{
int *p = w;
if (w) {
w[0] = 10; w[1] = 20; w[2] = 30; w[3] = 40;
}
return 0;
}
它是否可移植且合法地将NULL传递给上面定义的foo()(例如,对于我不需要更改w []的情况)?鉴于数组的名称是指向其第一个元素的指针,在我看来它应该没问题,但是我发现我错过了什么?
谢谢!
答案 0 :(得分:4)
在C中,数组类型函数参数与指针类型相同,因此以下内容相同:
static int foo(int w[]);
static int foo(int* w);
所以,是的,将NULL
传递给此函数是合法的。
假设数组的名称是指向其第一个元素的指针
不完全。在大多数情况下,数组衰减指向其初始元素的指针,例外情况是它是sizeof
或一元&
的操作数时运算符(运算符的地址)。
答案 1 :(得分:1)
应该没问题。您传递的数组中的元素数量仅仅是形式主义,并不是真正需要的。 w
只是指向int
的指针。没有其他运行时或编译检查。
答案 2 :(得分:1)
C99的构造具有可怕的语法(对于您的示例)
static int foo(int w[static MAX_COUNT]);
这基本上意味着该函数至少需要MAX_COUNT
元素。然后将考虑使用NULL调用这样的函数
作为一个错误。
不幸的是,此功能尚未广泛实施。例如gcc
并clang
只接受语法但不做任何有用的事情
信息。