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 ]
000
29.10.2004, 20:14 Uhr
~Fox
Gast


Hi @ all!

Ich habe diesen Code:

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;
char tmp2;
int x = 0;
int y = 0;
removef = malloc (sizeof (char*));
removef [0] = malloc (sizeof (char));

    while ((tmp = fgetc (remove)) != EOF)
    {

            if (tmp == '\n')
            {
            //printf ("%d\n", strlen (removef [0]));
            x++;
            removef [x] = malloc (sizeof (char*));
            y = 0;
            }
            else
            {
            removef [x][y] = malloc (sizeof (char));
            removef [x][y] = tmp;
            y++;
            }
                    
    };
    
    int z = 0;
    
    while (z <= x)
    {
    printf ("%s\n",removef[z]);
    z++;
    }
    
    return 0;

}



Mein Compiler sagt mir das hier:

Code:
code.c:39: warning: assignment makes integer from pointer without a cast


Zeile 39:

C++:
removef [x][y] = malloc (sizeof (char));



Das Programm funktioniert, aber schön ist die Warnung ja nicht ....
Wie kann ich das beheben. Hat jemand eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.10.2004, 20:23 Uhr
(un)wissender
Niveauwart


Dein Programm funktioniert ganz sicher nicht, und wenn doch, dann durch Zufall.
Da gibt es gleich mehrere Probleme

1. Du greifst auf Speicher zu, der dir nicht gehört.
2. Du weist einen char einen Pointer zu (kann nie gehen, weil zu klein)
3. Du gibst nichts frei

Sag mal, was das Programm tun soll, dann finde wir schon eine korrekte Lösung, aus dem obigen Code ist das leider nicht abzulesen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.10.2004, 20:33 Uhr
ao

(Operator)



Zitat von Fox:
Wie kann ich das beheben

Indem du *verstehst*, wie man mit char, char* und char** umgeht, das ist nämlich ziemlich wirr da (sorry für die deutlichen Worte).

Probier mal erst einen einfacheren Fall aus: Lies zuerst nur einen einzigen String ein, nicht ein ganzes Array. Und lass die Daten von der Tastatur kommen (stdin), dann brauchst du kein File.

Wenn ich am Wochenende Zeit hab, mach ich mal ein Stück Beispielcode.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.10.2004, 20:52 Uhr
~Fox
Gast


Mir ist schon kalr das malloc einen viod pointer returned, aber wenn ich den Speicher mit realloc erweitere:

C++:
realloc (removef [x], sizeof(char));


wird im 2. Durchlauf der erste String von 22 Zeichen auf 13 Zeichen gekürtzt.

Und freigeben tue ich nicht, da es nur ein Test-Code ist.

Was meinst du mit:

Zitat:

Du greifst auf Speicher zu, der dir nicht gehört.


Dieser Post wurde am 29.10.2004 um 20:53 Uhr von Fox editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.10.2004, 21:04 Uhr
(un)wissender
Niveauwart


realloc erweitert den Speicher nicht, wäre ja auch sehr billig!

Mit "Du greifst auf Speicher zu, der dir nicht gehört" meine ich, das du auf Speicherstellen zugreifst, die du dir nicht vorher mit malloc oder ähnlichem geholt hast. Durch Zufall kann das gehen, aber sicher ist das nicht und korrekt schon lange nicht.
Also, ich würde vorschlagen, du machst das, was ao vorgeschlagen hat, oder du schilderst was das Programm können soll und wir entwickeln gemeinsam etwas.


Zitat von Fox:

Und freigeben tue ich nicht, da es nur ein Test-Code ist.



Ts, mit so einer Einstellung sollte niemand programmieren...
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 29.10.2004 um 21:05 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.10.2004, 21:12 Uhr
~Fox
Gast



Zitat von (un)wissender:
realloc erweitert den Speicher nicht, wäre ja auch sehr billig!

Mit "Du greifst auf Speicher zu, der dir nicht gehört" meine ich, das du auf Speicherstellen zugreifst, die du dir nicht vorher mit malloc oder ähnlichem geholt hast. Durch Zufall kann das gehen, aber sicher ist das nicht und korrekt schon lange nicht.
Also, ich würde vorschlagen, du machst das, was ao vorgeschlagen hat, oder du schilderst was das Programm können soll und wir entwickeln gemeinsam etwas.

[quote Fox]
Und freigeben tue ich nicht, da es nur ein Test-Code ist.



Ts, mit so einer Einstellung sollte niemand programmieren...[/quote]
Einfach in einen 2D Array der dynamisch initialisieren, in den Text aus einem File Stream (1D: Strings; 2D: Buchstaben der Strings) eingelesen wird. Und warum nehm ich denn nun Speicher, der mir nicht gehört? Ich hohle mir den mit malloc Speicher und erweitere ihn immer wieder. Realloc rerserviert mit den Speicher setzt mir einen Pointer dahin.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.10.2004, 21:20 Uhr
(un)wissender
Niveauwart


Gut, fangen wir mit dem Array an.
Zeige mal, wie du das machen würdest, jetzt erstmal ohne vergößern, aber mit freigeben!

Sagen wir, du will ein dynamisches Array äquivalent zu array[3][4] machen.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 29.10.2004 um 21:20 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.10.2004, 21:24 Uhr
~Fox
Gast


char **array;
int x = 3;
int y = 4;
int z = 0;


array = malloc(x * sizeof(char*));

while(z <= x)
{
array [z] = malloc(y * sizeof(char*));
z++;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.10.2004, 21:41 Uhr
(un)wissender
Niveauwart


Ok, nicht schlecht, zwei Fehler sind drin.


C++:
int main()
{
    char **array;
    int x = 3;
    int y = 4;
    int z = 0;


    array = malloc(x * sizeof(char*)); //Korrekt, 3 mal einen Pointer speichern

    while(z < x) //Jeden String initialisieren (3 mal), also < nicht <=, da sonst 4 {0,1,2,3}
    {
        array [z] = malloc(y * sizeof(char)); //sizeof(char*) ist nicht korrekt,
                                            //denn wir wollen ja einen String mit 4 zeichen, a
                                            //also 4 * sizeof(char)
        z++;
    }
}




Jetzt gibt das ganze mal wieder frei.


Bearbeitung:

Das mit dem <= ist so ein typischer Fall, wo du Speicher benutzt, der dir nicht gehört.
sizeof(char*) ist auch 4 (zumindest meistens auf 32 Bit-Systemen), ich weiß, aber es geht ums Prinzip, ich hätte ja auch eine Länge von 5 verlangen können, dann wäre es tatsächlich nicht mehr korrekt.


--
Wer früher stirbt ist länger tot.

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


Sag mir jetzt einfach, wie ich den array erstellen kann und dann ist gut! Bitte!
 
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: