我有两种结构,如下所示
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'时出现不兼容的类型。
我做错了什么?
答案 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;
}