SIGSEGV ptrString



  • Hey Leute hab gerade ein kleines probelm unzwar

    typedef char* str;
    typedef char** pstr;
    
    typedef struct
    {
     str String;
    }A;
    int main(void){
    A* B;
    uint C;
    GetAStrings(&C,NULL); 
    B = (A*)malloc(sizeof(A)*C);
    GetAStrings(&C,B);
    
    pstr StringList = NULL;
    /* Hatte Die String list versucht auf verschiedene wege zu initalizieren
     * z.B char StringList[C][256]   // 256 Maximale string länge
     *  StringList[I]   = (char*)malloc(sizeof(char)*Strlength);
     * memset oder realloc hat auch nicht funtioniert
     */
     for(uint I=0;I<C;I++){
    // Hier kommt SIGSEGV 
    strncpy(StringList[I],A[I].String,strlen(A[I].String));
    strcat(StringList[I],"\0");
    } 
    
    }
    

    Ich finde darüber leider auch nicht viel.
    Ich hoffe das hier jemand ne Idea hat 😅



  • Was genau ist denn dein "kleines Problem"? Ich seh hier gar keinen Sinn in dem Programm. Du wirfst ein paar chirurgische Instrumente in die Luft und eins steckt dir nun im Auge. Was sollte das?



  • Problem ist ich möchte bzw kann kein C++ verwenden. Also ein std::vector fällt weg.
    Ich möchte den String aus der Structur in Die Liste der strings einfügen.
    Leider bekomme ich Beim Copieren des Strings einen Segmentation fallout.
    A[I].String ist nicht NULL, hab versucht die StringList mittels, memset, malloc realloc , Neuen Speicher zu Freizuräum bekomme dann immer noch zum Krasch



  • @Abe sagte in SIGSEGV ptrString:

    Ich möchte den String aus der Structur in Die Liste der strings einfügen.

    Du hast überhaupt keine Liste von Strings vorliegen.

    Leider bekomme ich Beim Copieren des Strings einen Segmentation fallout.

    Du bekommst erstmal einen Compilerfehler. Also ist das wahrscheinlich sowieso nicht der Programmcode, in dem das Problem auftritt. Bring das mal in Ordnung.

    A[I].String ist nicht NULL, hab versucht die StringList mittels, memset, malloc realloc , Neuen Speicher zu Freizuräum bekomme dann immer noch zum Krasch

    So funktioniert C nicht. Man probiert nicht einfach irgendwas. Weil Programme auch dann falsch sein können, wenn sie augenscheinlich funktionieren. Das ist dann halt Zufall und crasht bei der nächsten Änderung, oder beim Kunden. Völlig falsche Herangehensweise.



  • @Bashar sagte in SIGSEGV ptrString:

    Du hast überhaupt keine Liste von Strings vorliegen.

    Erbsenzähler dann möchte ich halt Die Strings der structuren in ein Mehrdimensonales char array Kopieren oder verschieben.

    Du bekommst erstmal einen Compilerfehler. Also ist das wahrscheinlich sowieso nicht der Programmcode, in dem das Problem auftritt. Bring das mal in Ordnung.

    Bekomm ich leider nicht.

    So funktioniert C nicht. Man probiert nicht einfach irgendwas. Weil Programme auch dann falsch sein können, wenn sie augenscheinlich funktionieren. Das ist dann halt Zufall und crasht bei der nächsten Änderung, oder beim Kunden. Völlig falsche Herangehensweise.

    Der bei der funktion GetAString(uint,A*) funktioniert alles.



  • @Abe sagte in SIGSEGV ptrString:

    Problem ist ich möchte bzw kann kein C++ verwenden

    Das ist schon mal ein guter Ansatz, in C++ NICHT mit C-Pointern rumzufrickeln.

    Die Benutzung von strncpy ist sinnbefreit, deine Namenskonventionen sind grausam.

    Bashar hat recht, räume erstmal deinen Code auf und präsentiere (gemäß Forumsregeln) ein (minimal) compilierbares Beispiel.
    Ich kann mir zwar denken, was dein Code bezwecken soll, aber deine Versuche sind derzeit nur ein Stochern im Nebel.



  • #inclue<stdlib.h>
    #include<stdio.h>
    #include<vulkan/vulkan.h>
    #include<string.h>
    /*
    *  Ist jezt nur zum test in die main geschrieben 
    */
    int main(void)
    {
         uint32_t Count = 0;
         vkEnumerateInstaceLayerPropeties(&Count,NULL);
        vkLayerPropeties* Props = (vkLayerPropeties)malloc(sizeof(vkLayerPropeties)*Count);
        vkEnumerateInstanceLayerPropeties(&Count,Props);
       // Oder wie in den sampels in der  do while schleife
     /* 
           uint32_t Count = 0;
           VkResulut res = VK_SUCCES; // optimstisch bleiben 
      * do{
                        res = vkEnumerateLayerPropeties(&Count,NULL);
                       if(res != VK_SUCCES)
                           return;
                     if(Count == 0)
                         continue; //Schleife neustarten 
                     Props = (vkLayerPropeties)malloc(sizeof(vkLayerPropeties)*Count);
              }while(vkEnumerateLayerPropeties(&Count,Props)== VK_INCOMPLETE);
     */
       char** Names = NULL; // NULL schlägt Kdevlop vor Names[Count][256] Hilft auch    nicht
        for(uint32_t I=0; I<Count; I++){
           Names[I] = (char*)malloc(sizeof(char)*strlen(Props[I].layername)) 
          // memset(Names[I],0,sizeof(char)*strlen(Props[I].layername))  Auch nicht
          //  memcpy memmove half auch nicht
         // hab anstell strncpy auch memmove verwendet der Abstrutz kam an der selben stellele
          strncpy(Names[I],Props[I].layername,strlen(Props[I].layername));
          strcat(Names[I],"\0") // Ende des strings anhängen 
    
    }
    
    
    gcc -W -Wall -Wextra -Werror main.c -o test -lvulkan 
    

    Verwende Ubuntu jezt 20.06



  • @Abe sagte in SIGSEGV ptrString:

    Names[I]

    Da ist nichts das eine Adresse speichern könnte. Names ist NULL!



  • @manni66 sagte in SIGSEGV ptrString:

    @Abe sagte in SIGSEGV ptrString:

    Names[I]

    Da ist nichts das eine Adresse speichern könnte. Names ist NULL!

    Hunderpunkte Schrelog 😂
    und Wie schaffe Ich es nun das Names[I] auf eine Addresse zeigen Kann ?

    char* Names[256] = (char*)malloc(sizeof(char)*Count); //  Sollte Speicher für char Names[Adresse die ich frei räumen wollte ] 
    //[256] // sollte dann in der forschleife genauer geschaffen werden Ja etwas unlogisch und verzweifelt  
    char** Names  = (char**)malloc(sizeof(char)*256*tmp) // sollte platz fur tmp* strings schaffen auch War das logischste was ich versucht habe 
    
    char Names[Count][256] ; // Das selbe  Wollte den Fehler anders als mit =NULL wegbekomm 
    // realloc half  Mittels char**Names = NULL; Names = (char**)realloc(sizeof(char)*256*tmp) Eigentlich auch sinlos 
    // oder verwendet wie malloc oben 
    

    ich möchte halt auch die auf dem jeweiligen system vorhanden layer und extentions verwenden



  • @Abe Dann erklär mal für jeden deiner Versuche, was genau er machen soll.

    Im Übrigen: sizeof(char) ist immer 1.



  • typedef char LayerName[VK_MAX_EXTENSION_NAME_SIZE];
    
    ...
        LayerName *Names = malloc(Count*sizeof*Names);
        for(uint32_t i=0; i<Count; i++)
            strcpy(Names[i],Props[i].layername);
        for(uint32_t i=0; i<Count; i++)  /* Testausgabe */
            puts(Names[i]);
        free(Names);
    ...
    


  • @Abe sagte in SIGSEGV ptrString:

    schlägt Kdevlop vor Names[Count][256]

    Das ist ebenfalls sinnbefreit, da VLA.
    Und sowas schlägt KDevelop vor?!



  • char** Names = NULL  //Schlägt es vor Names[Count][256] war meine idea
    

    Danke auf jeden fall das sieht auch Etwas logischer aus.
    Eine frage eribt sich noch

    // Warum funktioniert
    typedef char[256] str;
    str*Name = malloc(sizeof(char)*3*256) // beispiel
    //und 
    char*Names[256] = malloc(sizeof(char)*3*256)
    // nicht
    

    Das stell doch das selbe dar oder nicht?



  • @Abe
    Das ist nicht dasselbe,

    1. ist ein Zeiger auf ein char-Array
    2. ist ein Array von char-Zeigern

    Ein Zeiger ist kein Array, ein Array ist kein Zeiger. (Wann welche Besonderheiten gelten, sagen dir C-Profis im Schlaf, alle anderen (inkl. C++ler) parlieren zwar darüber, haben aber keine Ahnung davon)



  • Alles klar wir wohl noch etwas dauern bis ich das richtig verstanden habe.



  • @manni66 sagte in SIGSEGV ptrString:

    Im Übrigen: sizeof(char) ist immer 1.

    Und sizeof(char*) ist was anderes.



  • @DirkB sagte in SIGSEGV ptrString:

    @manni66 sagte in SIGSEGV ptrString:

    Im Übrigen: sizeof(char) ist immer 1.

    Und sizeof(char*) ist was anderes.

    Tja nur das im vom Abe gezeigten code nirgends sizeof(char*) auftaucht.



  • @firefly sagte in SIGSEGV ptrString:

    Tja nur das im vom Abe gezeigten code nirgends sizeof(char*) auftaucht.

    Aber an manchen stellen sollte.


Anmelden zum Antworten