wie groß darf eine Array sein?
-
[quote="frickyäääh, wie war das doch gleich mit malloc und casts des rückgabewertes???
:)[/quote]das ist pfuiiiiiiiiiiiiiiiii !
-
einem geschenken gaul schaut man nich ins maul..
wo liegts problem?
-
BorisDieKlinge schrieb:
einem geschenken gaul schaut man nich ins maul..
wo liegts problem?Hier
http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.html
-
Die Sprache C kennt seit ihrer ANSI-Standardisierung im Jahre 1989 den allseits bekannten void-Zeiger. Dieser hat die Eigenschaft, dass er implizit in Zeiger anderen Typs umgewandelt wird. Eine explizite Umwandlung ist damit unnötig.
unnötig aber nich falsch...
-
BorisDieKlinge schrieb:
...Umwandlung ist damit unnötig.
unnötig aber nich falsch...[/quote]
unnötig und gefährlich, weil damit programmierfehler vor'm compiler versteckt werden können. streng genommen ist es also doch falsch.
-
Danke für die Hinweise zu erste! mit 'malloc' habe ich so verstanden, wenn ich eine Variable( sehr groß!) benutze, kann ich mit malloc für eine bestimmt Zeitraum eine große Speicherplatz resiervieren, wenn ich fertig bin, kann ich die Speicherplatz sofort wieder freigeben!
aber wenn ich die Variable für lange Zeit brauche, dann ich das auch keine endgültig Lösung, oder verstehe ich das falsch?
und mit malloc kann ich eine bestimmt SPeicherbereich bestellen, und später die bestimmt Bereich gezielt wieder löschen. 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 mit malloc bestellen.) bekomme ich keine Fehlmeldung? und, heißt das, dass ich durch Verwendung von Malloc keine 'neue' Speicherplatz geschafft habe, sonder ich kann nur die nicht mehr nötige Speicherplatz befreien?zu dem Code von BorisDieKlinge
1: double stack[500][500]; stack[x][y]=5;
2:
double *pStack = (double*)malloc[sizeof(double)*500*500]; pStack[x*500+y]=5; free(pStack);
die zwei Code habe ich nicht verstanden!
code_1: wofür ist 'stack[x][y]=5;' ?
code_2: bei Code_2 ist auch eine ähnliches dabei: 'pStack[x*500+y]=5;'
-
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.