2016-12-05 64 views
0

我想分配一個字符串變量的值給結構的另一個字符串變量。但是gdb給出了運行時錯誤。錯誤如下: 程序收到信號SIGSEGV,分段錯誤。 0xb7f7c8f8在 從/usr/lib/i386-linux-gnu/libstdc++.so.6如何將字符串變量的值賦給C++中結構的字符串變量?

我的C++程序的std :: string ::分配(的std :: string常量&)()爲:

#include<iostream> 
#include<stdlib.h> 
#include<string> 
typedef long unsigned int LUI; 
using namespace std; 
struct graph { 
    string string_node; 
    LUI node; 
    struct graph *link; 
}; 
struct graph *abc[30]; 
struct graph *t; 
string x; 
int main() { 
    t = (struct graph *) malloc(sizeof(struct graph *)); 
    x = "abc"; 
    t->string_node = x; 
    t->link = NULL; 
    abc[0] = t; 
    cout << "Value is " << abc[0]->string_node << endl; 
    cout << "end"; 

    return 0; 
} 

請幫我把x的值存入t-> string_node。在此先感謝..

+0

嘗試之前你有沒有讀過cpp的課程?你真的應該。 http://www.learncpp.com/ – Stargateur

+1

使用'new'正確分配內存。 –

回答

2
t = (struct graph *) malloc(sizeof(struct graph *)); 

是一類。它包含C++類,特別是它包含std::string

所有C++類必須使用new運算符在動態範圍內構建。它們不能用C庫函數malloc()來構造,它對C++類完全沒有任何知識。這樣做會導致未定義的行爲(無論如何,您的malloc-ed大小都是錯誤的)。

既然你寫C++代碼,你需要完全忘了malloc()realloc(),並free()曾經存在過,並且始終使用newdelete

1

你的問題是,你分配與malloc一個struct,但struct沒有隻POD(普通舊數據)成員:它有一個std::string成員,std::string對象希望是構建。簡單地爲其分配內存與malloc不會調用std::string構造函數,因此嘗試與std::string進行交互將導致未定義的行爲,因爲該對象處於不良狀態。

你,而不是應該使用new分配您struct,這將妥善分配內存調用每個成員的默認構造函數。 (相反,你需要釋放內存delete,而不是free正確調用析構函數每個成員的

另外,也可以使用"placement new"來構建你已經分配的內存中的對象,但這不是你通常需要做的事情。

+0

謝謝...它使用新的後... ... –

相關問題