wie groß darf eine Array sein?
-
gy100002000 schrieb:
aber wenn ich die Variable für lange Zeit brauche, dann ich das auch keine endgültig Lösung, oder verstehe ich das falsch?
doch, das geht. nach dem aufruf von malloc ist der speicher gültig, bis zum aufruf von 'free'. du kannst also den speicher z.b. erst in 10 jahren wieder freigeben. eine zeitliche beschränkung existiert nicht.
gy100002000 schrieb:
Aber wenn ich von Anfang an gar keine genug Speicherplatz vorhanden,(z.B. im SPeicher ist noch 3 Byte frei, ich möchte 5 Byte bestellen.) bekomme ich eine Fehlmeldung?
ja, malloc gibt dann 0 zurück, was so viel heisst wie 'antrag abgelehnt'.
gy100002000 schrieb:
heißt das, dass ich durch Verwendung von Malloc keine 'neue' Speicherplatz geschafft habe
'malloc' ist die C-benutzerschnittstelle zum OS bzw. speicher-management des systems (einschlisslich virtual memory usw.). es wird natürlich kein neuer speicher geschaffen, sondern vorhandener (ob nun physikalisch oder virtuell) deinem programm zugeteilt.
-
alles klar! fricky, Danke für die Antwort!
-
//Hier reserviert du einen speicherblock von 500*500*4 Bytes //dieser beginnt an der stelle der Adresse des Zeigers pStack double *pStack = (double*)malloc[sizeof(double)*500*500];
Den zeiger pStack kannst du nun durch dein programm rumreichen bspw. funktionsparameter übergeben etc.
Dein 2 Dim Array wird sequentiell gespeichertdas heist 4*500 Bytes blöcke liegen 500 mal hintereinder.
// mit diesem aufruf greifst du quasei auf die kodinaten x,y im block zu
int x=??,y=??; pStack[x*500+y]=5;
wenn der speicehr nicht mehr notwendig ist bspw. am ende deines programm löscht du ihn wieder mit
free(pStack);
-
BorisDieKlinge schrieb:
free(pStack);
du castest den rückgabewert von 'malloc', aber das argument von free castest du nicht? na, wie passt das denn zusammen?
-
entschuldigung... muss nebenberi arbeiten.. solche kleinigkeiten überseh ich
-
Da die Dimensionen bereits beim Kompilieren bekannt sein sollen, können wir das Ganze allerdings etwas bequemer handhaben. Nur weil unser Objekt zu groß, heißt das doch nicht, dass die einfache Notation üblicher Array-Indizierung aufgeben werden muss.
double (*pStack)[500] = malloc(500*sizeof *pStack); pStack[x][y]=5; free(pStack);
-
camper schrieb:
[cpp]double (*pStack)[500]
nice
-
fricky schrieb:
camper schrieb:
[cpp]double (*pStack)[500]
nice
womit hast du es compiliert ?
nice, wenn es der compiler frisst.C:\Programme\PellesC\Projects\test\test.c(6): error #2001: Syntax error; found 'double' expecting '{'.
-
Kommando zurück!
Der Fehler war meinerseits und liegt woanders!
-
davon abgesehen:
double *pStack[500]
hier hab ich ein zeiger array, was ist wenn das zeiger array
100000000 groß ist.. dann ist der stack wieder zu voll;)
dann lieber so
double **pDimX= malloc(500*sizeof(*double)); for(int y=0; <500; ++y) pDimX[y]= malloc(500*sizeof(double);
sicher paar synax fehler drin^^
-
Nein, dann lieber die lineare Variante und die Indizierung mit pStack[x*500+y];
Dann sparst du ganz viele Zeiger und RAM
-
wieso? statt 1.000.000 Bytes hast halt 1.002.000 Bytes^^
-
BorisDieKlinge schrieb:
davon abgesehen:
double *pStack[500]
hier hab ich ein zeiger array, was ist wenn das zeiger array
100000000 groß ist.. dann ist der stack wieder zu voll;)deswegen benutzen wird auch nur einen zeiger: *double (pStack)[500];
-
BorisDieKlinge schrieb:
...
hier hab ich ein zeiger array, was ist wenn das zeiger array
100000000 groß ist.. dann ist der stack wieder zu voll;)
dann lieber so ...NÖ, dann hast du 100000000 * sizeof ( double* ) Bytes zuviel.
Macht Summa Summarum 400000000 Bytes. In Worten: vierhundert millionen. Das ist fast ein halbes, verschwendetes Gigabyte.
-
[quote="Der Linearisierer
NÖ, dann hast du 100000000 * sizeof ( double* ) Bytes zuviel.
Macht Summa Summarum 400000000 Bytes. In Worten: vierhundert millionen. Das ist fast ein halbes, verschwendetes Gigabyte.[/quote]Sorry! Ich habe wohl ganz schön Quatsch geschrieben gerade. Da muss ich noch mal überlegen!
Gruß
D.L.
-
Der Linearisierer schrieb:
Sorry! Ich habe wohl ganz schön Quatsch geschrieben gerade. Da muss ich noch mal überlegen!
Gruß
D.L.Nein. Kein Quatsch. So ist das.