2011-10-24 3 views
0

나는 서버 측 데몬을 c로 작성 중이며 클라이언트로부터의 연결을 허용합니다. 나는 각각의 열린 커넥션에 대한 정보를 유지하는 구조체가 필요하다. 그래서 나는 정의 된 구조체의 배열을 만들었고 realloc을 사용하여 동적으로 크기를 조정했다.동적으로 배열 구조체 배열을 확장합니다.

문제는 배열 내에 구조체를 만드는 것입니다. 이 오류가 계속 발생합니다.

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

무엇이 잘못 되었나요?

저는 PHP로 대부분의 시간을 보내고 c는 멍청한 놈입니다. 나는 간단하고 초보자 인 실수를하고 있음을 깨닫는다. 내가 바보 같은 짓을하고 있다면 알려줘. 나는 내 양질의 시간을 구글에 넣었지만 그것을 알아 내지 못했다. 나는 다음과 같이 작은 규모에 문제를 재현 : 여기

내 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_list에 할당 할 때, 이미 할당 된 구조체의 각 멤버를위한 공간이있다

test_list[id] = (struct test)malloc(sizeof(test)+(sizeof(int)*5)+strlen(ip)+1); 

삭제

test *tmp = realloc(test_list,size*sizeof(test)); 

test *tmp = realloc(test_list,size); 

을 변경해보십시오 그것을 다시 할 필요가 없습니다. 당신은 그 구조 내에서 어떤 포인터를 할당해야합니다.

+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 : realloc을() : 다음 크기의 무효 : 어떤 경우에 루프 내에서 몇 반복 후 ...' 를, 내가 준 너는 나의 초기 질문에 대답했다. – cegfault

+0

nevermind; 나는 그것을 작동 시켰어. 도와 주셔서 감사합니다 – cegfault

0

반환 값 malloc '은 할당 한 메모리 주소입니다. 구조체에 캐스트 할 수 없습니다. 그게 무슨 뜻일까요?

다음과 같은 것을 원합니다. test_list = realloc (test_list, num_alloc * sizeof (test_));