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,- ist ein Zeiger auf ein char-Array
- 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.