Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » malloc, realloc Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.08.2003, 16:33 Uhr
Pablo
Supertux
(Operator)


Wieso funktioniert es nur 13 Mal?


C++:
#include <stdio.h>
#include <malloc.h>

int main()
{
    int i;
    char** m;
    m = malloc(1);
    m[0] = (char*)malloc(225);
    for(i=0; i<20; ++i) {
        realloc(m,i+1);
        m[i] = (char*) malloc(255);
        sprintf(m[i], "zeile %d", i+1);
        printf("%s\n",m[i]);
    }
}


Wieso bekomme ich das?

zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
zeile 8
zeile 9
zeile 10
zeile 11
zeile 12
Speicherzugriffsfehler
??? wieso


Bearbeitung:

Das ist nur ein Bsp. Mir ist das Problem in einem anderen Programm, das ich grad schreibe. Da ist mir eingefallen, dass wenn i == 13, d.h wenn m[ i ] = (char*)malloc..... tritt der Fehler auf. Wenn man die Zeilen ab m[ i ] == (char*)malloc.... löscht, dann gibt es den Fehler nicht. D.h. an realloc liegt es nicht, sondern an malloc. In meinem Programm bricht auch nach 13 Mal ab, in diesem Beispiel auch. Wieso?


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 28.08.2003 um 16:55 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.08.2003, 16:46 Uhr
Tommix



13 ist die Unglückszahl
nein, erstens allokierst Du für char* nur ein Byte und zweitens weist Du m bei realloc nicht den neuen Wert zu:

C++:
#include <stdio.h>
#include <malloc.h>

int main()
{
    int i;
    char** m;
//    int* p=&z;
    m = malloc(sizeof(char*));
    m[0] = (char*)malloc(225);
    for(i=0; i<20; ++i) {
        m = realloc(m,sizeof(char*)*(i+1));
        m[ i ] = (char*) malloc(255);
        sprintf(m[ i ], "zeile %d", i+1);
        printf("%s\n",m[ i ]);
    }
}



Gruss, Tommix

Nachtrag: Es fehlen auch die free's.

Dieser Post wurde am 28.08.2003 um 16:50 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.08.2003, 16:54 Uhr
Pablo
Supertux
(Operator)


@Tommix: ich werde das ausprobieren.

Jetzt verstehe ich aber weniger sogar.

Ich hab im Code

C++:
realloc(m,i+1);



durch

C++:
realloc(m,1);


ersetzt und in der For-Schleife i<200 und jetzt hat es aber funktioniert. Das kann ich aber nicht verstehen wieso.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.08.2003, 16:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

13 ist die Unglückszahl


*löl*
Ich hatte ihm überlegt die selbe dumme Antwort zu geben.
Leider wusst ich zusätzlich nicht die richtige Antwort und habe es deshalb lieber gelassen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.08.2003, 17:04 Uhr
Pablo
Supertux
(Operator)


Was mich wundert ist, dass wenn ich @Tommix Lösung benutze und wenn ich realloc(m,1) benutze, funktioniert das Beispielprogramm.

Wieso muss man sizeof(char*) nehmen, wegen char**?
sizeof(char*) ist 4 oder?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.08.2003, 17:31 Uhr
Tommix



Naja, wenn Du in nicht bzw. falsch allokierten Speicher schreibst kann das durchaus gut gehen. Bei mir ist er schon beim vierte Aufruf abgeschmiert.
Wenn Du ein char* speichern willst, brauchst Du soviele bytes, wie ein char* auf Deinem System benötigt. 2, 4, 8 - wie auch immer.
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.08.2003, 18:07 Uhr
virtual
Sexiest Bit alive
(Operator)


Leider ist bisher keine der hier vogestellten Lösungen bzw. Ansätze korrekt. Ich möchte Euch auf diesen FAQ Beitrag, insbesondere der 3. den dort diskutierten Lösungsansätze ans Herz legen. Wer keine Links mag:

C++:
...
            /* Oh - wir müssen den Speicher vergrößern. Das geht mit realloc:
             * Wir speichern zunächst in tmp den neuen Speicher. Bei realloc
             * ist es so, daß tmp==NULL ist, wenn kein Speicher da ist. Dann
             * Zeigt [ i ]buf aber immer noch auf den alten Speicher.
             * Funktioniert realloc hingegen, ist der Speicher, auf den [ i ]buf
             * zeigt ungültig, die neue Address steht dann in [ i ]tmp.
             */

            char* tmp = realloc(buf, str_laenge+vokal_anzahl+1);
            if (NULL == tmp)
            {
                /* Mist: kein Speicher */
                return NULL;
            }
            else
            {
                /* Okay: neuen Speicher merken; auch dessen Länge */
                size = str_laenge+vokal_anzahl+1;
                buf = tmp;
            }
...


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 28.08.2003 um 18:07 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.08.2003, 18:27 Uhr
Pablo
Supertux
(Operator)


@virtual: Deiner Meinung nach, welche wäre dann die beste Lösung?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.08.2003, 18:47 Uhr
virtual
Sexiest Bit alive
(Operator)


@Pablo
Alles in C++ zu machen, natürlich.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.08.2003, 18:54 Uhr
Pablo
Supertux
(Operator)


Schöne Antwort, aber das habe ich nicht gemeint.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: