我有点困惑。下面是一个非常简单的例子:
#include <stdlib.h>
typedef struct
{
unsigned char one: 1;
unsigned char two:1;
unsigned char three: 1;
unsigned char four: 1;
} nibble_bits;
typedef union
{
unsigned char all : 4;
nibble_bits bits;
} nibble;
void initArr(nibble ** arrLoc, unsigned int size)
{
nibble * start = arrLoc[0];
int i =0;
for (i=0; i<size; i++)
{
start[i].all = 0;
}
}
int main()
{
nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));
initArr(&fourNibbles,4);
}
这编译得很好,没有警告。但是,当我更改 main 中的第一行时:
nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));
至:
nibble fourNibbles[4];
我得到以下信息:
警告:main.c:在函数'main'中:main.c:150:警告:从不兼容的指针类型传递'initArr'的参数1
运行时,我收到“总线错误 10”。
在我看来,这些行在做同样的事情,除了 malloc 为堆上的数组分配空间并且数组声明在堆栈上。但是(我认为)无论哪种方式“fourNibbles”都是“指向nibble的指针”类型,因此“fourNibbles”的地址将是指向nibble的指针(nibble **)。
我在这里想念什么?