Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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...".

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 ;-)

@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]

*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.

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.

ok, mein Posting hat sich grad erledigt *gg*

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.