Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » komisches malloc 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 <
010
29.10.2004, 22:25 Uhr
(un)wissender
Niveauwart


?
Das haben wir doch gerade getan! Dein korrierter Code belegt korrekt den Speicher (unter der Voraussetzung, das malloc nicht 0 liefert).
Und entweder wir machen das richtig, oder gar nicht, dann musst du das alleine tun.
Fox, etwas zu programmieren ist nicht mal eben schnell gemacht, das erfordert Geduld und Übung.

Ein generischer Ansatz, den du dann immer wieder korrekt verwenden kannst und ihn nur einmal schreiben musst, wäre das hier (ein wenig Objektorientierung kann c nicht schaden):

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

//Datenstruktur
typedef struct
{
    char ** data;
    int x,y;
} TwoDCharArray;

//Methodendeklarationen
int init2D(TwoDCharArray *, int, int); //Speicher holen

//Die müssen wir noch machen...sind aber recht kurz
int readElementAt2D(const TwoDCharArray *, int, int, char *); //aufs Feld zugreifen (lesen)
int writeElementAt2D(TwoDCharArray *, int, int, char); //aufs Feld zugreifen (schreiben)
int resizeXDim2D(TwoDCharArray *, int); //Vergößern
int free2D(TwoDCharArray *); //Löschen


int main(void)
{
    TwoDCharArray array;
    if(init2D(&array, 3, 4))
    {
        printf("Init successful!\n");
    }
    else
    {
        printf("Init not successful!\n");
    }
    
    return 0;
}

int init2D(TwoDCharArray * array, int x, int y)
{
    int counter = 0;
    array->data = malloc(x * sizeof(char*));
    if(!array->data)
    {
        return -1; //Keinen Speicher bekommen, Fehler
    }

    while(counter < x)
    {
        array->data[counter] = malloc(y * sizeof(char));
        if(!array->data[counter]) //Keinen Speicher bekommen
        {
            while(--counter >= 0) //Speicher wieder freigeben, sonst Speicherloch
            {
                free(array->data[counter]);
            }

            free(array->data);
            array->data = NULL; //Sicher ist sicher, bei Zugriffen gibt es jetzt sofort Ärger.
            return -1;
        }
        ++counter;
    }
    
    array->x = x;
    array->y = y;
    
    return 1;
}



Wenn jemand noch Fehler findet, bitte melden!
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 29.10.2004 um 22:40 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
29.10.2004, 23:03 Uhr
~Fox
Gast


So hier meine Lösung:


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
char *diffremoved=strdup ("diff file1.txt file2.txt | egrep '<' ");

FILE *remove;
remove = popen (diffremoved,"r");

    /*if (!remove = popen (diffremoved,"r"))
    {
    perror ("");
    exit (EXIT_FAILURE);
    return EXIT_FAILURE;
    }*/

    
char **removef;
char tmp;
int x = 0;
int y = 0;
removef = malloc (sizeof (char*));
removef [0] = malloc (sizeof (char));

    while ((tmp = fgetc (remove)) != EOF)
    {
        if (tmp != 10)
        {
        if (y == 0)
        {
        removef = realloc (removef, sizeof (char**));
        }
        
        removef [x] = realloc (removef [x], sizeof (char));
        removef [x][y] = tmp;
        //printf ("X: %d Y: %d C:%d\n",x,y,removef [x][y]);
        y++;    
        }
        else
        {
        x++;
        y = 0;        
        }
    }
    
    int z = 0;
    
    while (z <= x)
    {
    if (removef[z] != 0)
    {
    printf ("%s\n",removef[z]);
    }
    z++;
    }
    
    return 0;

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
30.10.2004, 00:28 Uhr
(un)wissender
Niveauwart


Du musst das selber wissen, aber programmieren lernst du so nicht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
30.10.2004, 01:12 Uhr
Spacelord
Hoffnungsloser Fall


Ist schon ziemlich frustrierend wenn man sich Mühe gibt etwas zu vermitteln und dann merkt dass man es auch seinem Friseur hätte erzählen können....

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
30.10.2004, 09:27 Uhr
(un)wissender
Niveauwart


Und der wäre immerhin dankbar fürs Gespräch...
Sowas wie bei Fox hatte ich in letzter Zeit schonmal, ich glaube, der hieß Werner oder so, der hatte auch so einen krassen Code (nur zwanzigmal so lang). Werner war auch ziemlich beratungsresistent.
Manchmal glaube ich, dass ich mir zu viel Mühe gebe, aber virtual, beefy, etc. haben sich füher auch oft Mühe mit mir gemacht, da will ich wenigstens ein bisschen zurückgeben.
Schade nur, wenn es auf Granit stößt.
Egal, wenn Fox noch weiter programmiert, dann wird er schon merken, dass es so ganz sicher nicht geht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
30.10.2004, 12:24 Uhr
Spacelord
Hoffnungsloser Fall


Eben dass muss er(sie?) wissen!
Gestern war ich auch wieder etwas erbost.Hier im C/C++ Forum ist nen Thread Datenstrukturen und da fragte ein Gast(kamicat oder so) wie man denn wohl ne einfach verkettete Liste sortiert.Daraufhin hat derphilipder ihm nen ziemlich langes Beispiel gepostet auf das keine Reaktion kam.
Und wenn man dann ins Pascal Forum guckt ist da auf einmal genau die gleiche Frage in dem Thread ADT.
Also da geht mir echt der Hut hoch!!
Ich finde das echt ne Frechheit dem gegenüber der sich die Mühe gemacht hat da nen Beispiel zu schreiben.....

PS: Der allerbeste ist aber definitiv lukash2004 aus dem Builder Forum!!
Der ist nicht mehr zu toppen!

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 30.10.2004 um 12:26 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
30.10.2004, 13:19 Uhr
Hans
Library Walker
(Operator)


He Jungs,

ihr seid nicht die Einzigen, denen das manchmal so geht. Das geht mir auch oft so, wenn ich mir mal die Zeit nehme, (die ich eigentlich gar nicht habe...) um was zu erklären, und dann kommt kein feedback. Da frag ich mich auch oft, wozu ich das eigentlich mache, und beantworte mir die Frage anschliessend reichlich zynisch, "damit ich dafür wieder einen Tritt in den Hintern bekomme"...

Aber ich bedanke mich trotzdem für das, was Ihr hier so geliefert habt, denn ich kann es in kürze brauchen, und werde dann darauf zurück greifen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
30.10.2004, 21:19 Uhr
(un)wissender
Niveauwart


Na immerhin.
Wobei du als Bibliothekar vermutlich eh alles weißt.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
31.10.2004, 20:30 Uhr
Hans
Library Walker
(Operator)



Zitat von (un)wissender:
Na immerhin.
Wobei du als Bibliothekar vermutlich eh alles weißt.


- äh, Nö!
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
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: