我试图分配内存来保存结构数组
SERVER* topology = malloc(sizeof(struct SERVER*)* 10 );
for (int i = 0; i < 10; ++i)
{
topology[i] = malloc(sizeof(struct SERVER));
}
PATH* paths = malloc(sizeof(struct PATH*)*10);
for (int i = 0; i < 10; ++i)
{
paths[i] = malloc(sizeof(struct PATH));
}
这些是我的结构
typedef struct{
int id;
char ip_addr[MAX_IP + 1];
int port;
}SERVER;
typedef struct{
int server1;
int server2;
int weight;
}PATH;
然后在我的代码中我尝试使用
释放它for (int i = 0; i < 10; ++i)
{
free(paths[i]);
}
free(paths);
for (int i = 0; i < 10; ++i)
{
free(topology[i]);
}
free(topology);
我一直收到以下错误
error: invalid application of 'sizeof' to an incomplete type 'struct SERVER'
topology[i] = malloc(sizeof(struct SERVER));
^ ~~~~~~~~~~~~~~~
:18:42: note: forward declaration of 'struct SERVER'
SERVER* topology = malloc(sizeof(struct SERVER*)* 10 );
^
:26:21: error: invalid application of 'sizeof' to an incomplete type 'struct PATH'
paths[i] = malloc(sizeof(struct PATH));
^ ~~~~~~~~~~~~~
:23:37: note: forward declaration of 'struct PATH'
PATH* paths = malloc(sizeof(struct PATH*)*10);
...........
c:97:11: error: passing 'PATH' to parameter of incompatible type 'void *'
free(paths[i]);
^~~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/stdlib.h:143:18: note: passing argument to parameter here
void free(void *);
^
:103:11: error: passing 'SERVER' to parameter of incompatible type 'void *'
free(topology[i]);
^~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/stdlib.h:143:18: note: passing argument to parameter here
void free(void *);
我一般都是C的新手。感谢任何帮助。
答案 0 :(得分:3)
试试这个:
X A B C
1 0.75 0.25 0
2 0 0 1
3 0.25 0.25 0.5
你知道,你使用typedef struct SERVER {
....
} SERVER;
typedef struct PATH {
....
} PATH;
和struct SERVER
,但你还没有声明这些。您确实在未命名的结构上使用struct PATH
声明了类型SERVER
和类型PATH
。
或者,您可以按原样保留结构,并使用typedef
和sizeof(PATH*)
。
答案 1 :(得分:2)
这里有几个问题:
SERVER* topology = malloc(sizeof(struct SERVER*)* 10 );
...
PATH* paths = malloc(sizeof(struct PATH*)*10);
SERVER
的类型,它是匿名结构的typedef。您没有定义struct SERVER
,因此请使用SERVER
代替struct SERVER
。这同样适用于PATH
。SERVER
分配10个指针的空间,但是topology
是指向SERVER
的指针,这意味着它可以充当SERVER
的数组,而不是一个SERVER *
数组,这就是你使用它的方式。这就是您在调用free
时收到错误的原因,因为topology[i]
是SERVER
,而不是SERVER *
。同样适用于PATH
。为了使其正常工作,您需要按如下方式定义topology
和paths
:
SERVER **topology = malloc(sizeof(SERVER *) * 10 );
PATH **paths = malloc(sizeof(PATH *) * 10);
或者,不是分配指针数组,而是分配单个元素,而是保留当前定义并立即分配整个数组:
SERVER *topology = malloc(sizeof(SERVER) * 10);
PATH *paths = malloc(sizeof(PATH) * 10);
然后像这样清理:
free(topology);
free(paths);