Frage zu Pointer und mehrdimensionalen Arrays
-
hi
auf die art wie du willst geht das nicht.
genauso wie du in c kein array zurück geben kannst, ausser über structs, oder anderen methoden.lowbyte
-
Ahhh okay das wollte ich wissen.
Ich nehme mal dann bei dass man die Länge von
int *ptr = calloc(4,sizeof(int));
auch nicht nachträglich bestimmen kann oder? (Also ohne dass man die Länge manuell in einer Variable mitzählt.Danke
-
hi
du hast die länge ja schon, und zwar 4. soviel initialisiert du ja be malloc.
vergrössern und verkleinern zur laufzeit kannst du mit realloc.warum nachträglich?
wen du die länge brauchst in einer funktion , kannst sie doch auch gleich mitûbergeben!
oder machst das ganze call by value.
lowbyte
-
Okay danke dir.
//--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main() { int *ptr; int ein,i,ctr = 1; printf("Zahl eingeben "); scanf("%10d",&ein); ptr = calloc(1,sizeof(int)); ptr[ctr-1] = ein; do{ printf("Zahl eingeben "); scanf("%10d",&ein); fflush(stdin); ptr = realloc(ptr,ctr+2); ptr[ctr] = ein; ctr++ ; }while(ein != 0); for (i = 0; i < ctr-1; i++) { printf("%d \n",*(ptr+i)); } free(ptr); system("pause"); return 0; } //---------------------------------------------------------------------------
Beim ausführen dieses Codes krieg ich irgendwie bei mehr als 4 Zahlen (inkl 0) eine Zugriffsverletzung.. ich sehe aber nicht wirklich worans liegt. Siehst du das zufällig auf die Schnelle?
-
hi
musst die adresse von ein übergeben nicht den wert !
&ein
lowbyte
-
ptr[ctr] = &ein;?
Das gibt noch mehr Datenmüll. Es wird ja dann andauernd die Adresse von "ein" übergegeben und diese ändert sich ja nicht. Oder seh ich das falsch?
Ohne das & wurden zumindest alle Zahlen ausser die letze ausgegeben
-
hi
sorry stimmt !
schreibe um ca 8uhr wen ich zuhause bin..
dan schaue ich mir das genau an.. ist ein bisschen blöde jetz weil ich mit meinem cell phone schreibe.lowbyte
-
Novio schrieb:
Hallo meine Frage zu dem obigen Quelltext: Wie krieg ich in der fkt2 die ware Größe von Feld raus?
Gar nicht
Man muß die Funktion schon anders formulieren, damit man die Größe in der Funktion kennt. Eine Variante (erfordert C99) ist folgende#include <stdio.h> #include <stdlib.h> #define REIHEN 4 #define SPALTEN 3 void fkt2 (size_t m, size_t n, int array[m][n]) { printf("%d\n",m*n*sizeof(int)); for (size_t i=0; i != m, ++i) { for (size_t j=0; j != n; ++j) { print("%d\n",array[i][j]); } } } int main(int argc, char* argv[]) { int feld[REIHEN][SPALTEN] = {1,2,3,4,5,6}; printf("%d\n",sizeof(feld)); // Ausgabe 48: weil 3*4*4 = 48 fkt2(REIHEN,SPALTEN,feld); return EXIT_SUCCESS; }
-
Das Problem ist ja eigendlich offensichtlich:
Der Datentyp int beansprucht 4 Byte d. h hier gibt es einen fetten Bufferüberlauf was zu einen Speicherzugriffsfehler mutiert.
ptr = realloc(ptr,ctr+2);
0 + 2 = 2
1 + 2 = 3
würde bei char funktionieren...Wesentlich besser ist:
ptr2 = realloc(ptr,(ctr+1)*sizeof(int));
-
Ach ich Depp...
Danke schön für die Hilfe^^