0

次のような構造体と初期化関数を取得しました。

struct someStruct {
    int* b, r;  // r is a pointer to an integer in b
};

someStruct* init_struct(size_t size) {
    someStruct* p = (someStruct*) malloc(sizeof(someStruct));
    p->b = (int*) malloc(size);
    p->b[0] = 16;
    p->r = &p->b;  // Here's the error, why?
    return p;
}
4

3 に答える 3

0

あなたのコードでは、rフィールドは整数であり、整数へのポインタではありません!また、&(p-> b)は、整数( )へのポインターへのポインターint**です。rがb配列の整数を指すようにする場合は、次のように構造体を定義する必要があります。

struct someStruct {
    int *b, *r;
}

そして、ポインタ自体ではなく、b( )の要素を逆参照することによってrポインタを割り当てます。intint*

p->r = &(p->b[0]);

または、以下を指す場合は、bを間接参照しないでくださいb[0]

p->r = p->b;
于 2012-06-22T13:22:11.627 に答える
0

Cを見てから15日ほど経ちましたが、エラーラインは次のようになっているはずです。

p->r = &(p->b);

しかし、それはただの予感です。この秒でテストする時間がありません。

つまり、b*のアドレスをp->rに格納するということです。

ただし、ポインタを使用すると、逆参照された値ではなくアドレスを保持するため、次のことができます。

p->r = p->b;

ポインタが指している場所のアドレスではなく、ポイントがある場所のアドレスを取得しようとしている場合を除きます。

于 2012-06-22T13:23:01.663 に答える
0

int* b, r;-このステートメントbは、int変数へのポインターでrあり、int変数であることを意味します。rをint変数へのポインタとしても宣言したい場合は、以下のいずれかの方法に従う必要があります。

第一の方法

int* b = NULL;
int* a = NULL;

2番目の方法

int *b = NULL, *a = NULL;

第三の道

typedef int* INT_POINTER;
INT_POINTER a = NULL, b = NULL;

#define代わりにマクロを使用しないでくださいtypedef

typedef混乱を避けるために、を使用するのが最善の方法です。

また、割り当てステートメントは次のようになりますp->r = &(p->b[0]);

于 2012-06-22T19:27:49.283 に答える