指向数组和相关表达式求值的指针

时间:2012-02-27 19:01:43

标签: c optimization

数组类型在传递给函数

时衰减为指针类型

这意味着在

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上,即使没有任何优化,代码也不会给出任何段错误。

1 个答案:

答案 0 :(得分:2)

来自C99标准第6.7.5.2节数组声明符,第1段:

  
      
  1. 除了可选的类型限定符和关键字static之外,[   和]可以划定表达式或*。如果他们划定表达式   (指定数组的大小),表达式应具有   整数类型。如果表达式是常量表达式,它应该是   值大于零。元素类型不得为   不完整或功能类型。可选的类型限定符和   关键字static只出现在函数的声明中   具有数组类型的参数,然后仅在最外面的数组中   类型推导。
  2.   

表达式*p的计算结果为0并且不满足上一段的要求,因此行为未定义。