Zum Inhalt springen

[C]: realloc


bmg4ever

Empfohlene Beiträge

also ich habe folgende funktion:


bool addspace(char ***array, int length, int elcount)
//gibt im Erfolgsfall 1 zurück
//im Fehlerfall wird -1 zurückgegeben.
{

if (*array == NULL) //init array
{
*array = (char **)malloc(1 * sizeof(char*));
if (*array == NULL) return 0;

*array[0] = (char *)malloc(length + sizeof(char));
if (*array[0] == NULL) return 0;


return 1;
}
else //add to existing array
{

*array = (char **)realloc(*array, 1 * sizeof(char*));
if (*array == NULL) return 0;

*array[elcount] = (char *)malloc(length + sizeof(char));
if (*array[elcount] == NULL) return 0;


return 1;
}


}
[/PHP]

und nun mein Problem.

in elcount wird die anzahl der bisherigen elemente übergeben. in length die länge des string, den man bruacht und natürlich eine referenz auf das lokale array names (hier also char ***array) damit auch nach der Funktion schön alle änderungen übernommen sind.

So nun klappt das initialisieren einwandfrei und das erste Element wird danach in der main-funktion auch wunderbar eingelesen.

allerdings schmiert dioe Funktion immer in der Zeile

----------------------------------------------------------

*array[elcount] = (char *)malloc(length + sizeof(char));

----------------------------------------------------------

mit der Meldung einer acess-violation ab.

elcount ist laut debugger auf 1 (also es soll jetzt das zweite element hinzugefügt werden). aber anscheinend läuft was mit realloc schief, obwohl der Rückgabewert nicht NULL ist....

also ich versteh das nicht mehr. vielleicht kann mir einer von euch helfen und spart euch bitte solche antworten, wie "warum du nicht strings...".

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich hoffe, den Code richtig verstanden zu haben. Auch wenn ich kein PHP kann, sieht C sehr ähnlich.

Bei Malloc gibst Du also freizugebenden Speicherplatz an

malloc(length + sizeof(char));

Der Sinn sollte denke ich sein, dass du (length * sizeof(char))

angibst. Denn dann wird tatsächlich die n-fache Länge eines char freigegeben, und nicht n-Byte (also length) plus einmal der Platz eines chars.

Hoffe, das das richtig war ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@biese:

ist ja auch C, ich nutz nur immer die php-funktion des Forums, da das schöner aussieht

aber schonmal danke. das war je selten dämlich von mir mit dem mal, obwohl das ja bei char in dem fall nicht der eigentliche grund war.

@klotzkopp:

hmmm..

da hab ich wohl mal wieder zu schnell über die funktionsbeschreibung hinweg gelesen. parameter size ist die neue größe und nicht die hinzuzufügende.

danke,

ABER.... :(

es geht immernoch nicht: [EDIT]immernoch der gleiche absturz[/EDIT]

hier mal mit main-funktion


//includes....

#define leer while(getchar() != '\n')

bool addspace(char ***array, int length, int elcount)
//gibt im Erfolgsfall 1 zurück
//im Fehlerfall wird 0 zurückgegeben.
{

if (*array == NULL) //init array
{
*array = (char **)malloc(1 * sizeof(char*));
if (*array == NULL) return 0;

*array[0] = (char *)malloc(length * sizeof(char));
if (*array[0] == NULL) return 0;


return 1;
}
else //add to existing array
{

*array = (char **)realloc(*array, (elcount+1) * sizeof(char*));
if (*array == NULL) return 0;

*array[elcount] = (char *)malloc(length * sizeof(char));
if (*array[elcount] == NULL) return 0;


return 1;
}


}




int main()
{
int laenge, counter, i; //counter zählt die Anzahl der Namen
char menu;
char **names = NULL;

laenge = 80; //max. Laenge der Namen

printf("Dieses Programm hilft Ihnen eine unbestimmte Anzahl Namen einzulesen\n\n");


counter = 0;

do {
printf ("Menue:\n");
printf ("-1- Neuen Namen hinzufügen\n");
printf ("-2- Programm beenden und alle eingelesenen Namen ausgeben\n");

printf ("\nAuswahl: ");
scanf("%c", &menu);
leer;


if (menu == '1')
{
if (addspace(&names, laenge, counter) == false) // Fehlerfall
{
system("cls");
printf ("Es ist ein Fehler aufgetreten!!!\nBeginnen Sie bitte von vorn.");
continue;
}

counter++;
printf("\n\nDer Name lautet: ");
fgets(names[counter-1], 80, stdin);

system("cls");

}
else if (menu == '2')
{
printf("\n\nDie von Ihnen eingegebenen Namen: ");

for (i=0; i<counter; i++)
printf("\n%s", names[i]);

printf ("\n\n\nAuf Wiedersehen. Beenden mit ENTER");
while (getchar() != 13);//aufs ENTER warten

}
else
{
system("cls");

printf("Ungueltige Auswahl!\n\n\n");
}

} while(menu != '2');


return 1;

}
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

*array[elcount] = (char *)malloc(length * sizeof(char));
if (*array[elcount] == NULL) return 0;[/PHP]

Hier ist das Problem. Der Arrayoperator [] bindet stärker als der Dereferenzierungsoperator *. Hier wird also zuerst array[elcount] ermittelt, und das dann dereferenziert. Es muss aber genau andersherum sein. Also musst du klammern:

[CODE][B]([/B]*array[B])[/B][elcount] = (char *)malloc(length * sizeof(char));
if ([B]([/B]*array[B])[/B][elcount] == NULL) return 0;[/CODE]

Übrigens: Im Thread steht zwar C, aber du benutzt offenbar doch zumindest einen C++-Compiler.

Warum quälst du dich dann mit malloc und realloc? Mit vector und string wäre das alles erheblich einfacher.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ah ok danke klotzkopp jetzt gehts.

man das muss man auch erstmal wissen.

Übrigens: Im Thread steht zwar C, aber du benutzt offenbar doch zumindest einen C++-Compiler.

Warum quälst du dich dann mit malloc und realloc? Mit vector und string wäre das alles erheblich einfacher.

nenn es eine eigenart oder wie auch immer du willst, aber eigentlich will ich versuchen mich an den ANSI-C standard zu halten.

desweiteren müsste ich mich in C++ dann erst entsprechend einlesen, da wir in der BS selbst strings noch nicht gemacht haben.

das ich MS Visual C++ benutze und daher einen "mixed"-compiler ist daher eigentlich irrelevant.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...