JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Realloc und strlen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 17:52    Titel: Realloc und strlen Antworten mit Zitat

Die Folgende Codezeile ergibt bei mir ein Problem:
Code:

if((pZeile3=(char *)realloc(akt->zeile, strlen(akt->zeile)+Zeilenlaenge+1))==NULL) {

Die Variablentypen sind hier alle In Ordnung, es steht vor dem Aufruf von realloc auch in akt->zeile ein String drin.
Trotsdem liefert mir strlen void zurück. Woran kann das liegen?

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 18:47    Titel: Antworten mit Zitat

Gut, das Problem hab ich gelöst.
Da realloc den ursprünglichen Zeiger akt->zeile gefreet hat, und einen neuen unter pZeile3 anlegen will, bekommt strlen keinen gültigen Zeiger auf einen String, obwohl im Speicher an der Stelle immer noch ein Text steht. Nun gut, das hab ich umgangen, indem ich strlen vor realloc aufrufe und das Ergebnis realloc zukommen lasse. - Kein Problem mehr also.
Doch nun ist (ein paar Zeilen tiefer) ein neues Problem aufgetaucht:
Die Folgende Codezeile verursacht ein Access Violation:
Code:

if((akt->next=(LPTEXTZEILE)malloc(sizeof(TEXTZEILE)))==NULL)

Dafür muß ich nun erklären:
TEXTZEILE ist ein struct (typedef), LPTEXTZEILE ein Pointertyp auf TEXTZEILE. (Habe ich woanders schon zig-mal verwendet, da gibt es keinen Fehler)
akt ist ein Struct. Es hat an dieser Stelle einen Gültigen Zeiger.
akt->next ist beim Aufruf dieser Zeile NULL (0x00000000).
sizeof(TEXTZEILE) gibt ganz richtig 8 zurück.
Die Zugriffsverletzung erfolgt (beim Schrittweisen Debuggen mitten in der malloc-Funktion, ohne einen Bezug auf meine Variablen.
Daß heisst, der Fehler würde auch auftreten, wenn ich an dieser Stelle nur schreiben würde:
Code:

malloc(8);

Komischerweise habe ich aber schon (alleine in dieser Funktion) 4 Weitere malloc's und einen realloc zu verzeichnen, die ohne Problem funktionieren, ja sogar diese Codezeile wird vor der Zugriffsverletztung bereits 3x aufgerufen und immer ohne Probleme.
Hat jemand eine Ahnung, woran dieses malloc-Problem liegen kann bzw. hat jemand schonmal ein ähnliches Problem gehabt?
Sollte ich mir vielleicht am Ende eine eigene Speicherallocierungsroutine schreiben?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 22:57    Titel: Antworten mit Zitat

Hi!
Ich würde nicht malloc und realloc nehmen, sondern lieber new/delete! Da wird malloc und realloc meines Wissens nach intern verwendet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.08.2002, 09:21    Titel: Antworten mit Zitat

Da hast du recht, intern wird malloc und free (bei delete) verwendet.
Aber ich will ja keine neue Instanz von einer Variable, sondern Speicherplatz:

Schreibe doch mal folgenden Code nach new/delete um...
Code:

typedef struct _MYTYPE {
  LPSTR data;
  _MYTYPE *next;
} MYTYPE, *LPMYTYPE;

LPMYTYPE first;

BOOL add_mytype(const LPSTR data) {
  LPMYTYPE akt, neu;
  neu=(LPMYTYPE)malloc(sizeof(MYTYPE));
  if(!neu) {
    return(FALSE);
  }
  neu->data=(LPSTR)malloc(strlen(data)+1);
  if(!neu->data) {
    free(neu);
    return(FALSE);
  }
  strcpy(neu->data, data);
  neu->next=NULL;
  // Neue Daten in Struct eingetragen, in Verkettete Liste einsortieren...
  if(!first) {
  first=neu;
  } else {
    akt=first;
    while(akt->next)
      akt=akt->next;
    akt->next=neu;
  }
  return(TRUE);
}

Dies ist ein einfaches Beispiel einer Verketteten Liste, so wie ich es (wenn auch in viel komplizierterer Form) Sehr oft verwende... Nun halt auch in meinem Programmabschnitt, wo der Fehler auftritt.
AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 25.08.2002, 17:01    Titel: Antworten mit Zitat

Meine Wenigkeit hat Folgendes geschrieben:
Hat jemand eine Ahnung, woran dieses malloc-Problem liegen kann bzw. hat jemand schonmal ein ähnliches Problem gehabt?

Das Problem hab ich gelöst und es lag nicht an malloc / realloc / free, sondern doch an mir. Ich hatte ein paar Zeilen vorher über grenzen des allokierten Speichers hinausgeschrieben, und damit zufällig die Verwaltungstabelle von malloc zerstört Wink

Also, Aufruf an alle:
Wenn ihr Speicher allokiert, überprüft die entsprechenden Codestellen lieber 3x zuviel, als dann ein undefinierbaren Fehler auszulösen und womöglich noch für Datenverlust zu sorgen...

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum