SIGSEGV ptrString



  • #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