probleme bei zeigerarray



  • servus hab mal ne kleine frage zum zeigerarray hab folgendes programm zum testen geschrieben nun will ich über ein zeiger ein buchstaben verändern hab das so versucht ohne glück was ist falsch? printf soll also oke ausgeben machts aber nicht!?

    #include <stdio.h>
    #include <string.h>

    const char *engwort[]= {
    "one",
    "two",
    "tree"
    };

    int main(void)
    {
    *(engwort[0]+1)='k';
    printf("%s",engwort[0]);

    return(0);
    }



  • das geht nicht.
    das ist das gleiche in grün, als wenn du versuchst aus

    char* p = "opa";
    p[1] = 'm';

    zu machen.
    denn das geht auch nicht.
    das sind diese ekeligen "read only strings" 😞
    🙂



  • davon mal abgesehen, hast du das als const deklariert.
    alles was const ist, kann nicht verändert werden, denn
    const kommt von konstant, d.h. soviel wie nicht veränderlich 😉

    nagut.
    du könntest es mit einem puffer realisieren, der beschreibbar ist:

    char arr[3][5] = {
    		"opa",
    	        "oma",
    		"oha"
    		}; 
     	arr[2][1] = 'j';
    puts( arr[2] );
    

    🙂



  • du musst dich schon entscheiden was du genau willst, wenn du sagst:
    char *arr[20];
    dann heißt das du hast in deinem Array 20 Zeiger auf char, somit müssen also Adressen in deinem Array stehen.
    wenn du sagst
    char arr[] = {"Hallo"};
    dann hast du ein Array vom Element Char, d.h. arr[0] = "H" usw.
    aber kreuzen geht nicht 😉
    oder du machst folgendes:

    int main(void) {
     char arr_1[] = {"Oma"}:
     char arr_2[] = {"Opa"};
     char arr_3[] = {"Hans"};
     char *arr[] = {arr_1, &arr_2[0], arr_3};
    
    return 0;
    }
    

    Ist ungetestet und sicher net der schönste weg, wollte dir nur mal ein Beispiel bringen 😉



  • Alex04 schrieb:

    du musst dich schon entscheiden was du genau willst, wenn du sagst:
    char *arr[20];
    dann heißt das du hast in deinem Array 20 Zeiger auf char, somit müssen also Adressen in deinem Array stehen.

    Tun sie im Originalpost doch auch. Ein Array mit Zeigern auf Literale 😉



  • Mein erstes Hilfskonstrukt in Sachen Zeigerarrays war anfangs:

    typedef struct
    {
      char* value;
    } tString;
    
    int main(int argc, char** argv)
    {
      tString strings[8];
    }
    

    Das Ganze ist sicherlich auch nicht das Gelbe vom Ei. Aber es tut was es tun soll und es ist anfangs sicherlich einfacher als:

    char **strings;
    
    strings = (char**) malloc(sizeof(char*) * 8);
    strings[0] = (char*) malloc(sizeof(char) * 10);
    ...
    strings[7] = (char) malloc(sizeof(char) * 10);
    

    Da komme ich nämlich leicht bei den Grenzen (strings[][]) durcheinander.



  • Wo liegt denn der Unterschied in der Einfachheit zwischen diesen beiden? Speicher musst Du doch trotzdem reservieren...

    char* array[8];
    array[0] = malloc(12);
    strcpy(array[0], "hallo");
    array[1] = malloc(50);
    strcpy(array[0], "welt");
    
    tString array[8];
    array[0].value = malloc(12);
    strcpy(array[0].value, "hallo");
    array[1].value = malloc(50);
    strcpy(array[1].value, "welt");
    

    BTW: malloc muss man nicht casten und sizeof(char) ist per Definition 1 😉



  • sorry no bonus schrieb:

    das sind diese ekeligen "read only strings" 😞

    die sind nicht eklig. die helfen z.b. den speicherbedarf zu verringern.
    🙂


Anmelden zum Antworten