2017-10-19 46 views
-2

我有这样SIGSEGV试图改变字符串结构C时/ C++

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

的结构,并且这样

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

林一些变量尝试初始化结构,并添加一些像这样的数据

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

当我用这段代码运行程序时,SIGSEGV信号在执行时试图执行:tP-> aPath = authPat H;当我删除这些结构的字符串成员,并保持只是int变量它没关系,一切工作正常。

谁能告诉我为什么会发生这种情况,以及如何解决它?谢谢

+5

这是C++ not C.使用'new'和'delete'而不是'malloc'和'free'。 –

+1

'这是C++而不是C.' @Captain Obvlious你不知道它。它可以是'typedef char * string;'或'#define string char *' –

+0

@ PeterJ_01实际上,即使使用小代码片段,也很清楚OP很可能尝试从C转换到C++,同时,或将两者混合在一起。这是一个常见的错误,并且确定这里发生的最可能的事情并不难。 –

回答

1

当你分配结构时,你只分配了threadparams结构的大小。底层的字符串没有正确构建。在内部,它们是指向未分配内存的指针。如前所述,当创建动态对象时,使用'new'将分配并正确地构造对象及其包含的所有对象元素。

+0

谢谢你们的帮助。 – John