dynamisches Speicher Problem
-
Hallo,
ich habe hier eine Datenstruktur ähnlich:
struct daten{ char *name_1; char *name_2; char *name_3; char *name_4; char *name_5; int zahl_1; int zahl_2; int zahl_3; int zahl_4; boolean valid_1; boolean valid_2; boolean valid_3; boolean valid_4; } struct datensatz{ daten namen[10000]; }
Damit die Daten nicht so viel Speicher fressen und wurden name_1 bis name_5 als pointer auf char definiert und erst beim Beschreiben eine Speichergröße zugewiesen
i=0; strcpy(inputstring, "dwtdwgdsgdsgadsghdghjs") malloc(namen[i].name_1, sizeof(inputstring)); strcpy(namen[i].name_1, inputstring)
das wurde dann je nach eingelesener Stringlänge und Inhalt meiner Textdatei das ganze Teil beschrieben und die Daten ausgegeben. soweit funktioniert es auch.
aber wenn ich nun versuchen mit:
for(i=0; 1<anzahl; i++){ free(namen[i].name_1) free(namen[i].name_2) free(namen[i].name_3) free(namen[i].name_4) free(namen[i].name_5) }
den Speicher freizugeben und dann mit den gleichen Proceduren neu zu beschreiben, hängt sich mein Programm auf. Jemand eine Idee was ich falsch mache?
-
Wie rufst du denn malloc auf O_o
void *malloc(size_t size);
->
strcpy(inputstring, "dwtdwgdsgdsgadsghdghjs")
namen[i].name_1 = malloc(strlen(inputstring) + 1);
strcpy(namen[i].name_1, inputstring)oder
strcpy(inputstring, "dwtdwgdsgdsgadsghdghjs")
namen[i].name_1 = strdup(inputstring)
-
Ja hast schon recht, ich hab beim abtippen von meinem code, blödsinn abgeschrieben also im code hab ich auch tatsächlich folgendes verwendet:
namen[i].name_1 = malloc(strlen(inputstring) + 1);
sonst würde mein Proggy ja gar nicht laufen. Also zumindest der erste Durchlauf des Einlesen, wenn noch gar kein Speicher allociert wurde. Das +1 hab ich aus so verwendet, ist wegen der Endkennung von String, wenn ich mich recht erinnere oder?
-
Poste doch mal den entsprechenden original code deines Programms, aus dem was du geposted hast wird das Problem nicht ersichtlich...
-
Bist du sicher, nicht benötigte
char * name_[i]
deiner struktur beim einlesen der Daten auf 0 (NULL) gesetzt zu haben?
Ansonsten wäre es möglich, daß du versuchst Speicher freizugeben, den du nie alloziiert hast.HIH
Greetz Swordfish
-
So jetzt bin ich auch mal wieder an meinem Rechner und eingeloggt, also hier der Code, der Teil des Code der mit "//" ausgeschaltet ist funktioniert einwandfrei, jedoch belegt mein Programm mit statisch angelegten Char Arrays in etwa 220MB Speicher, das ist halt net so toll, und im Normalfall (das Struct ist auf 10240 Server ausgelegt) werden nur ca. 1500 abgefragt und da sind wiederum nur ein kleiner Teil der CVAR und Player Datenfelder benutzt. Wie gesagt wenn ich 2 Versionen kompiliere läuft die statische über Stunden hinweg mit permanentem Serverscan von 50Server/Sec stabil durch. Die andere läuft einmalkomplett durch ohne Fehlermeldung, beim zweiten Durchgang crasht dann das Programm.
zuerst die Headerdatei:
typedef struct{ // char name[64]; //damit geht es // char value[64]; //damit geht es char *name; char *value; }cvar_t; typedef struct{ // char playername[64]; //damit geht es // char team[64]; //damit geht es char *playername; char *team; u_short ping; short score; }playerinfo_t; typedef struct{ char servername[64]; char mapname[64]; char modname[64]; char keywords[64]; char version[16]; u_int ip; u_short port; u_short country_id; int id; u_short cur_clients; u_short max_clients; u_short ping; u_short protocol; u_short num_of_cvars; boolean need_password; boolean punkbuster; boolean responding; double start_scantime; double last_scantime; playerinfo_t players[127]; //struct von oben cvar_t cvars[64]; //struct von oben }serverinfo_t; extern serverinfo_t serverinfo[10240];
Hier die C-Datei:
serverinfo_t serverinfo[10240]; void Startfunktion(void){ //wird nur einmal beim Start aufgerufen memset( &serverinfo, 0, sizeof(serverinfo)); } void Divide_CVARs(int server_id, char recvBuff[16384]){ char *pch; char recvBuff_tmp[16384]; char cvarname_tmp[64][64]; char cvarvalue_tmp[64][64]; char lasttoken[256]; int i=0, cvar_index=0; strcpy(recvBuff_tmp, recvBuff); pch=strstr(recvBuff_tmp, "\\"); strcpy(recvBuff_tmp, pch+1); pch=strchr(recvBuff_tmp, 10); if(pch){ *pch = 0; } pch = strtok(recvBuff_tmp,"\\"); while (pch != NULL){ if(strlen(pch) >= 64){ *(pch + 63) = 0; //Endkennung falls zu lang } if (!strcmp (lasttoken, "sv_hostname")){ strcpy (serverinfo[server_id].servername, pch); }else if (!strcmp (lasttoken, "mapname")){ strcpy (serverinfo[server_id].mapname, pch); }else if (!strcmp (lasttoken, "gamename")){ strcpy (serverinfo[server_id].modname, pch); }else if (!strcmp (lasttoken, "sv_keywords")){ strcpy (serverinfo[server_id].keywords, pch); }else if (!strcmp (lasttoken, "sv_maxclients")){ serverinfo[server_id].max_clients = atoi(pch); }else if (!strcmp (lasttoken, "protocol")){ serverinfo[server_id].protocol = atoi(pch); }else if (!strcmp (lasttoken, "g_needpass")){ serverinfo[server_id].need_password = atoi(pch); }else if (!strcmp (lasttoken, "sv_punkbuster")){ serverinfo[server_id].punkbuster = atoi(pch); } if(i == 0){ i++; }else{ // strcpy (serverinfo[server_id].cvars[cvar_index].name, lasttoken); //damit läuft der Code // strcpy (serverinfo[server_id].cvars[cvar_index].value, pch); //damit läuft der Code strcpy (cvarname_tmp[cvar_index], lasttoken); strcpy (cvarvalue_tmp[cvar_index], pch); cvar_index++; i = 0; } strcpy(lasttoken, pch); pch = strtok(NULL, "\\"); } serverinfo[server_id].num_of_cvars = cvar_index; //---------------------------------------------------------------------------------- ohne diesen Teil geht's wenn ich den Code komplett auf Char Arrays ausrichte for(i = 0; i < MAX_CVARS; i++){ if(serverinfo[server_id].cvars[i].name){ free(serverinfo[server_id].cvars[i].name); } if(serverinfo[server_id].cvars[i].value){ free(serverinfo[server_id].cvars[i].value); } } for(i = 0; i < serverinfo[server_id].num_of_cvars; i++){ if(serverinfo[server_id].cvars[i].name = malloc(strlen(cvarname_tmp[i])+1)){ strcpy(serverinfo[server_id].cvars[i].name, cvarname_tmp[i]); } if(serverinfo[server_id].cvars[i].value = malloc(strlen(cvarvalue_tmp[i])+1)){ strcpy(serverinfo[server_id].cvars[i].value, cvarvalue_tmp[i]); } } }
Ganz schön viel Code.