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

此代码无法编译并给出以下错误:从类型“struct server *”分配给类型“struct server”时类型不兼容。

我究竟做错了什么?

4

5 回答 5

3

这里的问题是表达式msg1.servers[0]产生 astruct 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;
于 2012-04-19T18:33:03.397 回答
2

您不需要&符号:

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

&s1会给你一个指向a的指针struct server,但msg1.servers[0]它是你刚刚分配的数组中的一个元素。

于 2012-04-19T18:32:36.517 回答
1

msg.servers是指向类型的指针server。当您使用时,msg.servers[0]您正在取消引用指针,因此它的类型是 now server, not 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 回答