malloc gibt NULL zurück



  • Ich hab eine funktion wo ein text auseinandergenommen wird und alles wichtige rausgeschrieben wird. Ich benutze immer dynamische Speicherverwaltung mit malloc. Ganz am ende versuch ich das selbe nochmal aber malloc gibt den wert NULL zurück, auch wenn ich einstelle das ich nur ein byte haben will und ich weiss das ich noch genug freien speicher hab.
    Es kann vllt daran liegen das ich die variablen nicht mit dem befehl free() freigeben kann dann kommt immer ein fehler.
    Ich Programmiere mit Visual 6.00 SP6 unter WinXP.
    plz help



  • Code bitte
    Wenn du nen Automechaniker fragst warum dein Auto nicht faehrt muss er sich das ja auch mal ansehen.



  • K sry, haette ja sein koennen das es das problem schon mal gab und eigendlich wollte ich euch den quelltext nicht antun da er 1. ewig lang ist und 2. abselut keine ordnung hat.
    Also ich schick ihn euch in 3 h dann bin ich wieder zuhause.



  • dann kürz den quelltext oder mach ein beispiel, wo der gleiche fehler auftaucht.
    hast recht, ungekürzt solltest du das keinem antun.



  • K ich hab so gut ich kann gekuerzt aber ist trotzdem noch viel, da ich ja nicht weiss welches teil am auto kaputt ist ;), aber ich kann sagen wann der fehler kommt.
    also es funktioniert alles bis auf die letzen 3 zeilen:

    if((string = (char *)malloc(5))==NULL){ /*hat malloc NULL zurückgegeben??*/
    		MessageBox(NULL, "Error, es konnte kein Speicher bereitgestellt werden!!!", "Error", MB_OK);
    		return;
    	}
    

    Also da kommt dann immer der Error "Error, es konnte kein Speicher bereitgestellt werden!!!"
    So hier nochmal die etwas gekuerzte Funktion:

    void taktikparser(char *pBuffer){
    	int unsigned i,j=0,k=0,anz=0,len=0,start=0,oldanz,oldk=13,playereig=0;
    	char buf[1024],*name,koord[7],gala[5],*met,*kris,*rang,*macht,*punkte,*playertmp;
    	char *player1,*player2;
    	int check=1,check2=0;
    	char test,test2;
    	char *string;
    	for(i=0;i<strlen(pBuffer);i++){
    		if((pBuffer[i] == '\t' ||  pBuffer[i] == 13 || pBuffer[i] == ' ')){
    			buf[j] = '\0';
    			j=0;
    			if(buf[0] != 0 && check == 1){
    				if(anz == 0){ if(!strgleich(buf,"Willkommen")) return;}
    
    				if(anz == 6){
    					met = (char*) malloc(strlen(buf)+1);
    					strcpy(met, buf);
    				}
    				//das alles nochmal mit allen anderen *char variablen
    				anz++;
    				if(check == 0) anz = 0;
    			}
    			else if(check == 0 || check == 3){
    				if(anz != 1 || buf[0] != 0){
    					test = pBuffer[i-strlen(buf)-1];
    					test2 = pBuffer[i-strlen(buf)-2];
     					if(anz == 0 && k == 0){
    						if(check == 0) len = strlen(buf)+1;
    						else{
    							player1 = (char*)malloc(len);
    							strcpy(player1, substrc(buf,0,' '));
    						}
    						anz++;
    					}
    					else if((test == 10 && test2 == 13 && pBuffer[i] == 32) || (test == 32 && (test2 != 32) && pBuffer[i] == 13) ){
    						if(check == 3) playertmp = (char*)malloc(strlen(buf)+1); //test2 != 32
    						if(anz == 0){
    							if(check == 3) sprintf(playertmp, ",%s", buf);
    							anz = 1;
    							if(!strgleich(gala, substrc(buf, 0, ':'))) oldk = k;
    						}
    						else{
    							if(check == 3) sprintf(playertmp, " %s", buf);
    						}
    						if(k != oldk){
    							if(check == 0) len += strlen(buf)+1;
    							else strcat(player1, playertmp);
    						}
    						check2 = 1;
    					}
    					else{
    						if(check == 3) playertmp = (char*)malloc(strlen(buf)+1);
    
    						if(buf[0] == '*'){
    							if(check == 3) sprintf(playertmp, " %s", buf);
    						}
    						else{
    							if(check == 3) sprintf(playertmp, "|%s", buf);
    							playereig++;
    							anz++;
    						}
    						if(check == 0) len += strlen(buf)+1;
    						else strcat(player1, playertmp);
    						if(playereig == 10){
    							playereig = 0;
    						}
    						check2 = 0;
    					}
    				}
    				else anz++;					
    				if(anz == 11){
    					k++;
    					anz = 0;
    				}
    				if(k==oldk){
    					if(check == 3) check = 4;
    					else{
    						i=start;
    						anz = 0;
    						check = 3;
    						k = 0;
    						anz = 0;
    					}
    				}
    			}
    			else if((check == 5 || check == 6) && buf[0] != 0){
    
    				if(k == 0 && anz == 0){
    					if(check == 5) len = strlen(buf)+1;
    					else{
    						player2 = (char*) malloc(len);
    						strcpy(player2,buf);
    					}
    				}
    				else if(anz != 6){
    					if(check == 5)len += strlen(buf)+1;
    					else{
    						if(buf[0] == '*'){
    							sprintf(playertmp, " %s",buf);
    							anz--;
    						}
    						else if(anz==0) sprintf(playertmp, "\n%s",buf);
    						else sprintf(playertmp, "|%s",buf);
    						strcat(player2, playertmp);
    					}
    				}
    				anz++;
    				if(anz == 9){
    					anz = 0;
    					k++;
    				}
    				if(k == oldk){
    					if(check == 6) check = 7;
    					else{
    						i=start;
    						check = 6;
    						k=0;
    						anz=0;
    					}
    				}
    			}
    
    		}
    		else{
    			if((pBuffer[i] != '\n') || check == 2){ //pBuffer[i] != 13 && 
    				buf[j] = pBuffer[i];
    				j++;
    				if(check == 0 && start == 0){
    					start = i-1;
    				}
    			}
    		}
    	}
    	if((string = (char *)malloc(5))==NULL){ /*hat malloc NULL zurückgegeben??*/
    		MessageBox(NULL, "Error, es konnte kein Speicher bereitgestellt werden!!!", "Error", MB_OK);
    		return;
    	}
    }
    


  • Ein Blick auf man: malloc(3) kann dir erklären, warum malloc NULL zurückgibt, nämnlich, weil malloc nicht in der Lage war, den Speicher zu allozieren; es kann sein, dass du keinen Speicher mehr frei hast.



  • also das keine 5 byte mehr frei sind ist im zeitalter des virtuellen speichers sehr ungewöhnlich! wenn es wirklich daran liegt, daß kein speicher mehr frei ist, dann sollte dein rechner vorher böse am swappen gewesen sein. wenn nicht, dann hat vielleicht ein anderer fehler irgendwo im programm speicherbomben gelegt.



  • also das programm belegt nur 2mb speicher kurz bevor der fehler kommt und mein OS sagt das ich noch ueber 250 mb frei habe.
    Hat irgendjemand eine idee? Hab auch mal probiert mit string[5] das funktioniert hilft mir aber nicht weiter ;(.



  • setz eine variable auf 0 und zähl sie bei jedem malloc eins hoch und bei free eins runter



  • versuche mal

    #include <windows.h>
    #include <stdlib.h>
    
    void
    main (void)
    {
      char *string;
    
      if((string = (char *)malloc(5))==NULL) /*hat malloc NULL zurückgegeben??*/ 
        MessageBox(NULL, "Error, es konnte kein Speicher bereitgestellt werden!!!", "Error", MB_OK); 
      else
        MessageBox(NULL, "Alles in Ordnung", "Error", MB_OK); 
    }
    

    zu compilieren und zu starten. wenn kein fehler auftritt, dann kanns zumindest kein fehler in der standartbibliothek sein. ich habs bei mir mit VC++ 6.0 probiert und da gibts keinen fehler.

    ich denke aber eher, daß dein programm wohl speicherbomben produziert. dh vielleicht schreibt dein programm einen speicherbereich über einen zeiger, der nicht mehr gültig ist. oder dein programm schreibt über das ende eines arrays oder allozierten speicherbereichs hinaus etc. dann würde dein programm einfach irgendwelche wichtigen daten anderer programmteile (wie zb malloc/free system der stdlib) überschreiben. das ist die einzige erklärung, die ich für deinen fehler habe. allerdings können sich solche speicherbomben überall im programm verstecken und sind deshalb leider nur sehr schwer zu finden.


Anmelden zum Antworten