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.


Anmelden zum Antworten