少し戸惑いました。以下は、動作する非常に単純な例です。
#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);
}
これは、警告なしで正常にコンパイルされます。ただし、メインの最初の行を変更すると:
nibble * fourNibbles = (nibble *) malloc(4 * sizeof(nibble));
に:
nibble fourNibbles[4];
私は以下を取得します:
警告: main.c: 関数 'main' 内: main.c:150: 警告: 互換性のないポインター型から 'initArr' の引数 1 を渡しています
実行すると、「バス エラー 10」が発生します。
mallocがヒープ上の配列にスペースを割り当て、配列宣言がスタック上にあることを除いて、行は同じことをしているように思えます。しかし(私は思った)どちらの方法でも「fourNibbles」は「ニブルへのポインター」タイプであるため、「fourNibbles」のアドレスはニブルへのポインターへのポインター(ニブル**)になります。
ここで何が欠けていますか?