2012-04-19 2 views
0

У меня есть две структуры, как показано нижеДинамически память распределение для массива структур в с

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 

Этот код не компилируется и дает следующее сообщение об ошибке: несовместимые типы при назначении типа «структура сервера» от типа "структура сервера *.

Что я делаю неправильно?

ответ

3

Проблема заключается в том, что выражение msg1.servers[0] producets a struct server, но вы предоставляете struct server* (тип указателя и тип не указателя). Есть два способа исправить эту

Первым должен просто предоставить struct server экземпляров по значению, как код ожидает

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

Это будет работать, если struct server типа, который ведет себя правильно, при копировании вокруг.

Второй необходим, если вы хотите продолжить использование struct server* в struct msg. В этом случае вам нужен двойной указатель для хранения указателей сервера. И вам нужно настроить malloc заявления надлежащего

struct msg{ 
    struct server** servers; 
}; 

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

Вам не нужны амперсанды:

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

Высказывания &s1 даст вам указатель к struct server, но msg1.servers[0] это единственный элемент в массиве вы только выделенными.

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); 

и то задания будут работать.

EDIT

Или, как все остальные указывая, падение & от задания. Это зависит от того, что вы намерены представить servers; это массив из struct server или массив указателей на struct server?

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; 
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; 
} 
Смежные вопросы