2016-09-21 48 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

相关问题