2017-10-19 41 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