Stringarray
-
arrtest.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv){ char *first = "first"; char *middle = "middle"; char *end = "end"; char *arr[10]; arr[0] = (char*)malloc(sizeof(first)); if(!arr[0]) exit(14); strcpy(arr[0], first); arr[4] = (char*)malloc(sizeof(middle)); if(!arr[4]) exit(14); strcpy(arr[4], middle); arr[9] = (char*)malloc(sizeof(end)); if(!arr[9]) exit(14); strcpy(arr[9], end); int i; for(i = 0; i < 10; i++){ if(arr[i]) printf("%s\n", arr[i]); } exit(0); }
Ausgabe:
first
�[�
�Qo�
Speicherzugriffsfehler (Speicherabzug geschrieben)Mag mir wer sagen, was ich da vergessen hab?
-
Die Pointer in dem Array sind nicht initialisiert.
Die zeigen irgendwo hin.
Beim Zugriff auf den BEreich auf den arr[3] hast du halt Glück gehabt, das der Fehler auftritt.middle ist ein Pointer.
Also ergibt sizeof(middle) auch die Größe des Pointers - und nicht die Länge des Bereichs auf den er zeigt.
Diese Information kannst du von einem Pointer nicht bekommen.
-
- du verwendest unsinnige malloc-Casts
- zu reservierst zuwenig Speicher, da du (falsch) sizeof auf Zeiger anwendest
- sizeof auf Array wäre hier richtig, dann müsstest zu deine Strings aber auch als Array definieren und initialisieren
- oder du verwendest strlen, dann aber +1 nicht vergessen (ist aber ziemlich hässlich)
-
DirkB schrieb:
Die Pointer in dem Array sind nicht initialisiert.
Die zeigen irgendwo hin.
Beim Zugriff auf den BEreich auf den arr[3] hast du halt Glück gehabt, das der Fehler auftritt.middle ist ein Pointer.
Also ergibt sizeof(middle) auch die Größe des Pointers - und nicht die Länge des Bereichs auf den er zeigt.
Diese Information kannst du von einem Pointer nicht bekommen.Wutz schrieb:
- zu reservierst zuwenig Speicher, da du (falsch) sizeof auf Zeiger anwendest
- sizeof auf Array wäre hier richtig, dann müsstest zu deine Strings aber auch als Array definieren und initialisieren
- oder du verwendest strlen, dann aber +1 nicht vergessen (ist aber ziemlich hässlich)Das erklärt so einiges.
Danke euch.Wutz schrieb:
- du verwendest unsinnige malloc-Casts
Unsinnig inwiefern?
Ich nehm übrigens gerne weitere Kritik an der Art und Weise, wie ich das (jetzt funktionierend) implementiert hab, entgegen:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NOF_EL 10 #define MAX_SIZE 10 int main(int argc, char **argv){ char *first = "first"; char *middle = "middle"; char *end = "end"; char **arr = calloc(NOF_EL, sizeof(char*)); arr[0] = (char*)malloc(MAX_SIZE); if(!arr[0]) exit(14); strcpy(arr[0], first); arr[4] = (char*)malloc(MAX_SIZE); if(!arr[4]) exit(14); strcpy(arr[4], middle); arr[9] = (char*)malloc(MAX_SIZE); if(!arr[9]) exit(14); strcpy(arr[9], end); int i; for(i = 0; i < 10; i++){ if(arr[i]) printf("%s\n", arr[i]); } exit(0); }
-
Mit dem MAX_SIZE verschenkst du Speicherplatz.
Unsinnig sind die cast, weil sie in C nicht nötig sind.*
malloc liefert einen Zeiger auf void, und die sind in alle anderen Zeiger ohne cast konvertierbar.*In C++ sind sie nötig. Das ist aber auch eine andere Sprache.
Wenn dein Compiler meckert, wenn du auf den cast verzichtest, ist er im C++-Modus.
Das ist nicht gut.
-
Danke dir.
DirkB schrieb:
Mit dem MAX_SIZE verschenkst du Speicherplatz.
Also doch
(strlen(...)+1)*sizeof(char)
?