Problem bei Übergabe von 2-Dim Array (Beide Dim. unbekannt)
-
Also ich würde gerne ein 2-Dim Array an eine Funktion übergeben kenne aber keine der beiden Dimensionen. Ich habe es mal so versucht:
int addChar(int arrows,int length,char* ar[arrows],char *string) { char zw[21]; void *zwar; zwar=realloc(ar,((arrows+1)*sizeof(char*))); ar=zwar; ar[arrows+1]=malloc(length+1); strncpy(ar[arrows+1],string,length); return(arrows+1); } int main(void) { char **test=malloc(21*sizeof(char)); char *string; int akt_pos=0,x=1; while(x) { scanf("%s",&string); addChar(1,20,test,string); if(strstr(string,"print")!=0) { for(x=0;x<akt_pos;x++) { strncpy(string,test[x],20); printf("s%d:%s\n",x+1,string); } } akt_pos++; } }
allerdings krieg ich immer einen Segmentation Fault wenn ich das erste Element eingebe. Geht es einfach nicht oder kennt jemand einen Trick wie man das bewerkstelligen kann?
Gruß HiFish
-
Du hast das Array 'test' zwar initialisiert, allerdings sollte das aus char*-Elementen bestehen, die jeweils auf eine Textzeile zeigen sollen. Und die hast du noch nicht initialisiert:
char **test = malloc(zeilen*sizeof(char*)); for(int i=0;i<zeilen;++i) test[i]=malloc(21); addChar(zeilen,20,test,str);
PS: Der Parameter 'ar' deiner Funktion ist nur eine Kopie des übergebenen 'test' - um die Variable im Hauptprogramm zu ändern, mußt du sie per Pointer übergeben.
-
Ich hab das geaendert so das test[0] initialisiert wird --->immer noch Seg Fault
Wenn ich dann der Funktion die Referenz übergeben will krieg ich einen Error:dyn.c:30: Warnung: Übergabe des Arguments 3 von »addChar« von inkompatiblem Zeigertyp
int main(void) { char **test=malloc(sizeof(char)); char *string; int akt_pos=0,x=1,rows=1; test[0]=malloc(21); while(x) { scanf("%s",&string); addChar(1,20,&test,string); if(strstr(string,"print")!=0) { for(x=0;x<akt_pos;x++) { strncpy(string,test[x],20); printf("s%d:%s\n",x+1,string); } } akt_pos++; } }
-
HiFish schrieb:
Ich hab das geaendert so das test[0] initialisiert wird --->immer noch Seg Fault
Du reservierst Platz für einen char (1 Byte) und willst dort einen char* (typisch 4 Byte) drin unterbringen - da ist ein Absturz vorprogrammiert.
Wenn ich dann der Funktion die Referenz übergeben will krieg ich einen Error:
Dazu mußt du den Prototyp der Funktion so anpassen, daß sie einen "char**ar[]" entgegennehmen kann.
-
hier scheint ja einige verwirrung zu herrschen
zuerst einmal ist das array, das du benutzt nicht zweidimensional sondern ein eindimensionales char*-array. zweitens, und das scheint für dich das größte problem zu sein, du willst das array in addChar() reallozieren und anschließend irgendwie aus der fünktion zurückgeben. und drittens hast du dich beim reallozieren des arrays gewaltig verhaspelt.
ich poste erst mal den korrekten code und anschließend versuche ich zu erklären, warum er so aussehen muß.
int addChar(int arrows,int length,char ***ar,char *string) { *ar=(char**)realloc(*ar,((arrows+1)*sizeof(char*))); (*ar)[arrows+1]=(char*)malloc(length+1); strncpy((*ar)[arrows+1],string,length); (*ar)[arrows+1][length]='\0'; return arrows+1; }
erstmal willst du ein eindimensionales array von char* erstellen. das ist vom typ char**. außerdem willst du das array in addChar() reallozieren und wieder zurückgeben. dazu mußt du einen zeiger auf das array übergeben. und ein zeiger auf einen wert vom typ char** ist vom typ char***
wenn du auf einen string in einem array vom typ char** zugreifen willst, dann geht das per array[i]. da dein parameter aber ein zeiger auf ein char** ist, mußt du ihn erst dereferenzieren, um an dein array zu kommen. also (*array)[i]. *array[i] geht nicht. das wäre dasselbe wie *(array[i]), da der []-operator stärker bindet als der *-operator. was bei *(array[i]) rauskäme, das überlasse ich dir als denksportaufgabe.
außerdem hast du vergessen, ein abschließendes null-byte anzuhängen. das macht strncpy() nämlich nicht automatisch.