2012-02-27 25 views
2

当它被传递到功能指针阵列和相关的表达式求值

这意味着在

一种阵列型衰减到指针类型
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进行优化。启用优化后,我不会收到段错误。在叮当中,即使没有任何优化,代码也不会给出任何段错误。

+0

没有声明'void func(int(* ptr)[* p])'和'void func(int * ptr [])'完全一样吗? – Bart 2012-02-27 19:52:07

+3

我不知道'void func(int x [RANDOM_STUFF])'是有效的! – 2012-02-27 20:57:54

+0

@OliCharlesworth:这不正确吗? – 2012-02-28 03:12:37

回答

2

从C99标准节6.7.5.2组声明,第1段:

  1. 除了可选的类型合格音响ERS和关键字静态的,则[ 和]可限定表达式或*。如果它们定义了一个表达式 (它指定了一个数组的大小),表达式应该有一个整数类型 。如果该表达式是一个常量表达式,则其应该具有大于零的值。元素类型不应为 不完整或函数类型。可选类型限定符和 关键字静态只应出现在具有数组类型的函数 参数声明中,然后仅在最外面的数组 类型派生中出现。

表达*p的计算结果为0,不满足上述段的要求,所以该行为是未定义。