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)
    

    ?


Anmelden zum Antworten