|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 16:52 Titel: Realloc und strlen |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 17:47 Titel: |
|
|
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:
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 |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 23.08.2002, 21:57 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.08.2002, 08:21 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 25.08.2002, 16:01 Titel: |
|
|
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
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 |
|
|
|
|
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
|