2011-10-24 3 views
0

Я (пытаюсь) написать серверный демон в 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; 
} 

ответ

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

+0

, который сделал трюк! (почти): Я также изменил следующие несколько строк на ' \t test * x = & test_list [id]; \t x-> id = id; \t x-> ip = malloc (strlen (ip)); \t \t strcpy (x-> ip, ip); \t x-> user = 0; \t x-> str = NULL; ' И я получаю: ' *** Glibc обнаружены *** ./test: перераспределить(): недействительный следующий размер: ... ' после нескольких итераций в моем цикле для В любом случае, я дал вы точки (вы ответили на мой первоначальный вопрос). – cegfault

+0

nevermind; Я заработал. Спасибо за помощь – cegfault

0

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

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