?
Danke fuer die hilfe
# include <stdlib.h>
# include <stdio.h>
# include <windows.h>
int main()
{
unsigned char ** ronny;
unsigned int x,zeilen=50000,spalten=6;
ronny = calloc (zeilen,sizeof(unsigned char*));
if (ronny == NULL) {
printf("can`t allocate memory");
exit(1);
}
for (x=0;x<zeilen;x++) {
ronny[x] = malloc (spalten);
if (ronny[x] != NULL) {
strcpy(ronny[x], "hallo");
printf("ronny[%i]: %8s\n",x,ronny[x]);
}
else {
printf("can`t allocate memory");
exit(1);
}
}
for (x=0;x<zeilen;x++) {
// printf("destroy ronny[%i]: %8s\n",x);
free (ronny[x]);
}
free (ronny);
Sleep(10000);
return 0;
}
Das ist Unsinn. calloc(0, ...), was soll das bringen? Offensichtlich willst Du in ronny auch keine char-Elemente speichern, sondern Elemente vom Typ char*! Und davon willst Du nicht 0 Elemente speichern, sondern 50000. Also "ronny = calloc(50000, sizeof(char*));"
ja das macht sinn, jetzt
calloc (zeilen,sizeof(unsigned char*));
damit zeige ich dann auf
ronny[x]
und da ich sizeof wissen will
liefert mir die ?funktion?
die grosse in int von ronny[x]
die ich per malloc auf spalten reserviert habe.
Also vereinfacht gesagt
calloc (zeilen,spalten);
richtig?
Wenn dein Compiler einen Cast erfordert, dann ist das ein C++-Compiler. Für deine Belange ist das aber erst mal egal. Mach dann einfach die Casts wieder rein.
cast musste ich nachschlagen
http://de.wikipedia.org/wiki/Diskussion:C_(Programmiersprache)
Zur nachträglichen Aufklärung: malloc() gibt ein void* zurück und void* kann ohne expliziten Cast in jeden anderen Zeiger verwandelt werden. Einen expliziten Cast zu verlangen wäre bei einem Zeiger auf ein void auch grenzdebil. --Andreas B. 00:22, 27. Feb 2004 (CET)
ronny = calloc (zeilen,sizeof(unsigned char*));
statt
ronny = (unsigned char **) calloc (zeilen,sizeof(unsigned char*));
funktioniert auch!
Hab` mich an http://www.cplusplus.com/ref/cstdlib/calloc.html gealten
for (x=0;x<50000;x++) {
ronny[x] = (char *) calloc (spalten,sizeof(char));
ronny[x]="hallo\0";
Du meinst ich schreibe nicht in feld
ronny[x][0]="h"
sondern in
ronny[x][7]="h"
und wenn ja, wieso?
Den von dir allokierten Speicher gibst Du auch mit free nicht wieder frei (wie auch, das meiste davon hast Du überschrieben). Außerdem prüfst Du nicht, ob deine callocs überhaupt erfolgreich sind. Schau dir am besten in deinem Buch das Kapitel über Zeiger noch mal an.
Naja, eins nach dem anderen
pruefen obs reservieren klappt
haette ich gemacht wenn der rest funktioniert haette
oder waere mir durchs pruefen sofort aufgefallen warum es nicht klappt?
Free ebenfalls
aber frage warum kann ich bei free
nicht mit printf ausgeben was ich gerade loesche?
Zum Buch, ja aeh ...
da steht zu Matrix etwa dies
char array[2][3]={"ab\0","de\0"};
printf("[%s] [%s]",array[0], array[1]);
von **ptr
ganz zu schweigen