나는 서버 측 데몬을 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;
}
그 트릭을했습니다! (거의) : 다음 몇 줄을 으로 수정했습니다. ' \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
nevermind; 나는 그것을 작동 시켰어. 도와 주셔서 감사합니다 – cegfault