2017-10-19 22 views
-2

J'ai une structure comme celle-SIGSEGV lorsque vous essayez de changer la chaîne dans la structure C/C++

typedef struct { 
    string aPath; 
    string dPath; 
    string tmpPath; 
    int cSet; 
    int socket; 
    } threadParams; 

Et certaines variables comme celui-ci

string dirPath = "./Maildir/"; 
string authPath; 
string tmpPath = "~/tmpPath/"; 

Im essayant d'initialiser la structure et ajouter des données comme celui-ci

  threadParams *tP = (threadParams*)malloc(sizeof(threadParams)); 
      tP->aPath = authPath; 
      tP->cSet = cParam; 
      tP->dPath = dirPath; 
      tP->socket = commSocket; 
      tP->tmpPath = tmpPath; 

Quand je lance le programme avec ce code il y a SIGSEGV tout en essayant d'exécuter ceci: TP-> aLigne = authPat h; quand je supprime ces membres de la structure et que je conserve juste la variable int, tout fonctionne correctement.

Quelqu'un peut-il me dire pourquoi cela se produit et comment y remédier? Merci

+5

C++ n'est pas C. Utilisez 'new' et' delete' pas 'malloc' et' free'. –

+1

'C'est C++ pas C. '@Captain Obvlious vous ne le connaissez pas. Il peut être 'typedef char * string;' ou '#define string char *' –

+0

@ PeterJ_01 En fait, même avec le petit fragment de code, il est clair qu'il y a une forte probabilité que l'OP essaie de passer de C à C++, apprenant à la fois en même temps, ou en mélangeant les deux ensemble. C'est une erreur commune et pas vraiment difficile à identifier comme la chose la plus probable qui se passe ici. –

Répondre

1

lorsque vous allouez la structure, vous allouez uniquement la taille de la structure threadparams. Les chaînes sous-jacentes ne sont pas correctement construites. En interne, ils sont des pointeurs vers la mémoire non allouée. Comme indiqué précédemment, lors de la création d'un objet dynamique, utilisez 'new' pour allouer et construire correctement l'objet et tous les éléments qu'il contient.

+0

Merci à vous deux pour l'aide. – John