我正在(尝试)用c编写一个服务器端守护进程,它接受来自客户机的连接。我需要一个结构体来保存每个打开的连接的信息,所以我创建了一个我定义的结构体的数组,并使用realloc动态地调整它的大小。
我的问题是在数组中创建结构体。我一直得到这个错误:
test.c:41: error: conversion to non-scalar type requested
我做错了什么?
我花了大部分时间在PHP上,是一个c的新手。我意识到我犯了一些简单的,初学者的错误(换句话说,请随意取笑我)。如果我做了什么蠢事,请告诉我。我把宝贵的时间都花在了谷歌上,但还没弄明白。我以较小的规模复制了这个问题,如下:
这是我的测试。
typedef struct test_ test;
c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "test.h"
//define the struct
struct test_ {
int id;
char *ip;
int user;
char *str;
};
//yes, the list needs to be global
test *test_list;
//
// add an item to the global list
//
int add(int id, char *ip, int size)
{
//
// increment size
if(id>size) {
size = id;
//try to expand the list
test *tmp = realloc(test_list,size);
if(tmp) {
//it worked; copy list back
test_list = tmp;
} else {
//out of memory
printf("could now expand listn");
exit(1);
}
}
//
// HERE IS THE TROUBLE CODE::
test_list[id] = (struct test)malloc(sizeof(test)+(sizeof(int)*5)+strlen(ip)+1);
test_list[id].id = id;
test_list[id].ip = malloc(strlen(ip));
strcpy(test_list[id].ip,ip);
test_list[id].user = 0;
test_list[id].str = NULL;
}
//
// main
//
int main(void)
{
//initialize
int size = 1;
test_list = malloc(size*sizeof(test));
//add 10 dummy items
int i;
for(i=0; i<10; i++) {
size = add(i, "sample-ip-addr", size);
}
//that's it!
return 0;
}
尝试更改
test *tmp = realloc(test_list,size);
test *tmp = realloc(test_list,size*sizeof(test));
然后删除
test_list[id] = (struct test)malloc(sizeof(test)+(sizeof(int)*5)+strlen(ip)+1);
当你为test_list分配时,已经为每个分配的结构体成员分配了空间,所以你不需要再做一次。你只需要为结构体
从'malloc'返回的值是您已经分配的内存地址。不能将其强制转换为结构体。这到底是什么意思?
你想要这样的东西:test_list=realloc(test_list, num_alloc * sizeof(test_));