2014-11-08 11 views
-3

我写这样一个功能:C程序数组作为参数

void func1(char chx[], int y) 
    { 
    int wsn = 0; 

    wsn = *(int *) (&chx[2]); 
    if (wsn == 0) { 
    ... 
    } 
} 

编译器工作良好,没有警告,没有错误。但是当代码运行时,似乎会得到一个野指针。代码崩溃了。

想知道它为什么会崩溃

+1

编译所有警告和调试信息。使用调试器来了解发生了什么。这取决于你的'func1'被调用的方式,以及编译器,优化,处理器和ABI。也许是对齐问题。 – 2014-11-08 12:20:07

+2

因为1.指针不是数组,2.数组不是指针,3.这违反了严格的别名规则,因此它具有UB。 – 2014-11-08 12:20:17

+2

@BasileStarynkevitch此外,'chx'是一个指针,所以'&chx!= chx'。 – 2014-11-08 12:20:43

回答

1

当传递给函数时,数组衰减到指针。这意味着在func1变量chx是一个指针,所以&chx给你一个指针指针。

解决方法:不要使用地址 - 运算符&

+0

谢谢,我对数组感到困惑,认为数组可以得到数组地址。 – cssam 2014-11-08 12:33:47

+0

@cssam它可以,但'chx'是一个指针,而不是一个数组。 – 2014-11-08 13:56:18

+0

对不起,我再次检查了我的代码,用法如下:wsn = *(int *)(&chx [2]);不是wsn = *(int *)(&chx); – cssam 2014-11-08 22:46:07