Zuweisung an dynamisches char Array



  • Nabend,

    Hab da ein praktisches Problem ein dynamisches, 2 dimensionales char Array zu programmieren bzw. ihm Werte zu übergeben.

    1. source.h

    typedef struct {
      char **file;
      ...
    }tSource;
    

    2. source.c <main>

    tSource **source;
      ...
      while((opt = getopt(argc, argv, "s:")) != -1) {
        switch(opt) {
          case 's':
            if(strncmp(optarg, "F", 3) == 0) {
              for (i = 0 ; optind < argc; optind++, i++) {
                if(strncmp(argv[optind], "-", 1) == 0)
                  break;
                else {
                  source[i].file = malloc((strlen(argv[optind])+1) * sizeof(char)); // richtig? 
                  source[i].file = argv[optind]; // richtig?
                }  
              }
            }
    

    Hier sollen die Argumente die hinter "-sF" stehen alle in einem 2 Dimensionalem char Array abgespeichert werden. Beim Kompilieren erscheint allerdings immer: "request for member `file' in something not a structure or union" Warum?



  • source[i].file = malloc((strlen(argv[optind])+1) * sizeof(char)); // richtig
    

    falsch, weil file ein char** ist. Du willst bestimmt ein Array von char* haben, dann musst du davor (bspweise 10 reservieren)

    source[i].file = malloc(sizeof(char*)*10);
    for(k=0; k<10; ++k)
    {
        source[i].file[k] = malloc(strlen(argv[optind])+1);
        ...
    }
    


  • du weisst zuerst mit alloc einen neuen speicher zu mit malloc()
    und dann in der nächste zeile überschreibst du gleich wieder den pointer
    glaub das ist nicht was du willst

    mfg



  • HIer noch ein bisschen bsp code

    #include <malloc.h>
    #include <stdlib.h>
    
    char **a = 0; //is nur zum demonstrien soll natürlich nicht global sein
    int elements = 0;
    void add_new_element(){
    if(a){
    	a = (char**)realloc(a,elements + 1);
    	a[elements++] = "sdfdsf";
    	//oda
    	a[elements++] = (char*)malloc(12321);
    	}
    a = (char**)malloc(1);
    a[0] = (char*) malloc(123);
    }
    

    geht sicher besser 😃
    also denk lieber selber nochmal nach
    mfg



  • @supertux
    die fehlermeldung bleibt allerdings trotzdem:
    "request for member `file' in something not a structure or union"



  • versuche als erstes

    typedef struct tsource_tmp { 
      char **file; 
      ... 
    }tSource;
    


  • fehler bleibt...



  • source[i] ist ein pointer auf tSource.

    source[i]->file = ...
    

    sollte keinen fehler produzieren

    K.



  • Danke, das funktioniert.

    nur, irgendwie verstehe ich das trotzdem nicht richtig, zwecks typedef -> struct -> char * oder char **

    Soweit ich nun gelesen und verstanden habe, so hoff ich, habe ich mal ein kleines snipplet geschrieben. So, nun habe ich dort einen pointer auf einen char mit noch keinem Wert. Diesen Verpacke ich nun in eine struct und weise mit typedef an, daraus einen neuen Datentyp zu machen. Also erstelle ich eine neue Variable z.b namens "n_array" und greife mit dieser dann auf die einzelnen Werte mit dem "-> operator" in der struct zu, richtig?

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct ar {
      char *array;
    }tsArray;
    
    int main(int argc, char **argv) {
      tsArray *n_array;
      n_array->array = argv[1];
      printf("Array content: %s\n", n_array->array);
      return 0;
    }
    

    Nur warum läßt sich das obige code snipplet nicht ausführen, sondern endet mit einem segmentation fault? Was habe ich da nicht richtig gemacht? Bitte um hilfe bei dem Problem. 😕



  • du musst mit

    n_array = (tsArray*)malloc(sizeof(tsArray));
    

    est mal speicher reservieren.
    K.



  • ok, aber warum funktioniert ohne struct und ohne typdef

    array = argv[1];

    diese Zuweisung? Warum brauch ich dort kein malloc?



  • Tipp: Kauf dir ein gutes c Buch. oder schau dir zumindest ein tut über pointer
    an

    mfg



  • in diesem fall weist du nur einem pointer (array ist ein pointer im stack )einen anderen pointer zu. du schreibst also auf eine variable die schon am stack reserviert ist.
    im vorigen fall dereferenzierst du einen uninitialisierten pointer der irgendwohin zeigt.
    K.



  • dank dir.


Anmelden zum Antworten