2016-09-21 75 views
-1

當結構成員指向另一個結構時,出現分段錯誤。詳細地說,我的新結構指向另一個結構的結構指針成員導致分段錯誤(C/C++)

typedef struct _sock_t{ 
    ir_socket_t *_socket; 
    bool flag; 
    extern_class obj; 
    double *vect; 
}; 

,同時我想指出的結構ir_socket_t socket;。在main(),如果我做類似

_sock_t *_sock ; 
    _sock->_socket = &socket; 

然後我得到分段錯誤。然而,

_sock_t _sock ; 
    _sock._socket = &socket; 

工作正常。第一種方法出了什麼問題?

P.S.請注意0​​是C而不是C++結構。


UPDATE: 如果我還考慮一個C++類對象作爲新的結構部件,然後我仍然獲得分段錯誤在

int n(4); 
_sock->obj.resize(4); // here segmentation fault 

而沒有與後一種方法沒有問題(沒有指針)。即使我做_sock_t *_sock = (_sock_t *)malloc(sizeof(_sock_t));也會發生這種情況;使用@Bathshebba答案。

請問有什麼問題?

請注意_sock->vect= new double[n]工作正常。

還要注意,_sock = new _sock_t;工作得很好。

+1

你還沒有初始化'_sock'。 – juanchopanza

+0

'_sock_t * _sock'。在繼續進行C編程之前,您最好了解指針。這是一個沒有創意的指針,當然你不能解除引用。 – kaylum

+1

變量'_sock'未初始化爲指向有效(正確分配)的內存塊。 –

回答

2

這並不奇怪。在寫作_sock_t *_sock你所做的只是聲明一個指針。

但它不任何東西。 取消引用的行爲(在您的情況下,通過指向成員運營商->的指針)是undefined

您需要將它指向分配的內存。在C中使用malloc,在C++中使用new。一旦完成指針,請不要忘記分別撥打freedelete,否則您將內存泄漏

最後,(承認@Karthick),看起來你正在使用C++編譯器來編譯C代碼:在C中,你需要編寫struct _sock_t *_sock;

+0

「類型」一詞是冗餘IMO。 –

+0

@barakmanos:是的,我認爲你是對的;沒有它,它會更好地閱讀。 – Bathsheba

+0

我已經試過'_sock_t * _sock = NULL',但沒有成功。我應該嘗試'_sock_t * _sock = malloc(sizeof(_sock_t));'? – Courier