数组类型在传递给函数
时衰减为指针类型这意味着在
int func(int x[*p])
不应评估 *p
,因为声明等同于int func(int *x)
对指向数组的指针是否一样?
这是代码
int *p=0;
void func(int (*ptr)[*p]) //A
{
// code
}
int main()
{
int arr[5][5];
func(arr);
}
标准保证*p
的评估是//A
吗?
我尝试使用和不使用g ++ 4.6进行优化。启用优化后,我不会遇到段错误。在clang上,即使没有任何优化,代码也不会给出任何段错误。
答案 0 :(得分:2)
来自C99标准第6.7.5.2节数组声明符,第1段:
- 除了可选的类型限定符和关键字static之外,[ 和]可以划定表达式或*。如果他们划定表达式 (指定数组的大小),表达式应具有 整数类型。如果表达式是常量表达式,它应该是 值大于零。元素类型不得为 不完整或功能类型。可选的类型限定符和 关键字static只出现在函数的声明中 具有数组类型的参数,然后仅在最外面的数组中 类型推导。
醇>
表达式*p
的计算结果为0并且不满足上一段的要求,因此行为未定义。