динамически расширяющийся массив структур - PullRequest
0 голосов
/ 24 октября 2011

Я (пытаюсь) написать серверный демон в c, и он принимает соединения от клиентов.Мне нужна структура, которая хранит информацию о каждом открытом соединении, поэтому я создал массив моей определенной структуры и динамически изменил ее размер с помощью realloc.

Проблема, которую я имею, заключается в создании структуры внутримассив.Я получаю эту ошибку:

test.c:41: error: conversion to non-scalar type requested

Что я делаю не так?

Я провожу большую часть своего времени в PHP, и я нуб с c.Я понимаю, что я делаю некоторые простые, начинающие ошибки (другими словами, не стесняйтесь высмеивать меня).Если я делаю что-то глупое, пожалуйста, дайте мне знать.Я потратил свое качественное время с Google, но не понял это.Я воспроизвел проблему в меньшем масштабе, как показано ниже:

вот мой test.h:

typedef struct test_ 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 list\n");
            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;
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2011

Попробуйте изменить

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, уже есть место для каждого члена выделенной структуры, поэтому вам не нужно делать это снова. Вы просто должны выделить любые указатели в структуре

0 голосов
/ 24 октября 2011

Возвращаемое значение из 'malloc' - это адрес памяти, который вы выделили.Вы не можете привести это к структуре.Что бы это даже значило?

Вы хотите что-то вроде: test_list = realloc (test_list, num_alloc * sizeof (test _));

...