0

以下に示すように、2つの構造があります

struct server{
    // some members
};

struct msg{
    struct server* servers;
};

それから私はこれをします。

struct msg msg1;
struct server s1,s2;

msg1.servers = (struct server *)malloc(2*sizeof(struct server));
msg1.servers[0] = &s1; // compilation error 
msg1.servers[1] = &s2;  // compilation error

このコードはコンパイルされず、次のエラーが発生します: タイプ 'struct server *' からタイプ 'struct server' に代入するときに互換性のないタイプです。

私は何を間違っていますか?

4

5 に答える 5

3

ここでの問題は、式が a をmsg1.servers[0]生成するが、 (ポインター型と非ポインター型)struct serverを提供していることです。struct server*これを修正するには2つの方法があります

struct server1 つ目は、コードが期待するようにインスタンスを値で単純に提供することです。

msg1.servers[0] = s1;
msg1.servers[1] = s2;

これはstruct server、コピーされたときに適切に動作する型である場合に機能します。

struct server*で継続して使用する場合は、2 つ目が必要ですstruct msg。この場合、サーバー ポインタを格納するために double ポインタが必要です。mallocそして、ステートメントを適切に調整する必要があります

struct msg{
    struct server** servers;
};

msg1.servers = malloc(2*sizeof(struct server*));
msg1.servers[0] = &s1; 
msg1.servers[1] = &s2;
于 2012-04-19T18:33:03.397 に答える
2

アンパサンドは必要ありません。

msg1.servers[0] = s1;
msg1.servers[1] = s2;

と言うと、へのポインター&s1が得られますが、割り当てたばかりの配列内の単一の要素です。struct servermsg1.servers[0]

于 2012-04-19T18:32:36.517 に答える
1

msg.servers型へのポインタserverです。を使用msg.servers[0]すると、ポインターを逆参照しているため、その型はserverではなくになりました。明らかに、インスタンスserver *のアドレスをそれに割り当てることはできません。server

おそらく次のものが必要です。

struct msg{
  struct server** servers;
};

struct msg msg1;
struct server s1,s2;

msg1.servers = malloc(2 * sizeof(struct server *));
msg1.servers[0] = &s1;
msg1.servers[1] = &s2;
于 2012-04-19T18:36:01.040 に答える
0
msg1.servers[0] = &s1;

配列添字はポインタ (a[i] == *(a + i)を暗黙的に参照解除するため、式の型は , でmsg1.servers[0]struct serverありませんstruct server *

struct msg定義を次のように変更します

struct msg {
  struct server **servers; // servers will be an array of pointers
};

へのmalloc呼び出し

msg1.servers = malloc(2 * sizeof *msg1.servers); 

そして、割り当てが機能します。

編集

または、他のみんなが指摘しているように&、課題から削除します。何serversを表現するかによって異なります。の配列ですかstruct server、それとも へのポインタの配列struct serverですか?

于 2012-04-19T18:34:52.737 に答える
0

ポインタの配列が必要です

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    struct server{
        // some members
    };  

    struct msg{
        struct server ** servers;
    };  

    struct msg msg1;
    struct server s1,s2;

    if ((msg1.servers = malloc(2 * sizeof(struct server *))) == NULL) {
        printf("unable to allocate memory \n");
        return -1; 
    }   
    msg1.servers[0] = &s1; // compilation error 
    msg1.servers[1] = &s2;  // compilation error

    free(msg1.servers);

    return 0;
}
于 2012-04-19T18:37:07.897 に答える