为c中的结构数组动态分配内存

时间:2012-04-19 18:29:45

标签: c struct dynamic-memory-allocation

我有两种结构,如下所示

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'时出现不兼容的类型。

我做错了什么?

5 个答案:

答案 0 :(得分:3)

这里的问题是表达式msg1.servers[0]产生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;

答案 1 :(得分:2)

您不需要&符号:

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

&s1会为struct server提供指针,但msg1.servers[0]是您刚刚分配的数组中的单个元素。

答案 2 :(得分: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;

答案 3 :(得分: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的指针数组?

答案 4 :(得分: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;
}