Я (пытаюсь) написать серверный демон в 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;
}
, который сделал трюк! (почти): Я также изменил следующие несколько строк на ' \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
nevermind; Я заработал. Спасибо за помощь – cegfault