【发布时间】:2016-09-21 07:09:05
【问题描述】:
当结构成员指向另一个结构时,我会遇到分段错误。详细来说,我的新结构是
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;
工作正常。第一种方法有什么问题。
附:请注意,ir_socket_t 是 C 而不是 C++ 结构。
更新: 如果我还将 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; 可以正常工作。
【问题讨论】:
-
你还没有初始化
_sock。 -
_sock_t *_sock。在继续进行 C 编程之前,最好先了解指针。那是一个未初始化的指针,当然你不能取消引用它。 -
变量
_sock未初始化为指向有效(正确分配的)内存块。 -
请不要以显而易见的理由投反对票。恕我直言,这个问题写得很好。
-
这是 pointer 对象和 struct 对象之间的区别。
_sock_t *_sock ;定义了一个不指向任何地方的 pointer 对象;如果您尝试使用_sock->_socket(引用因为它没有)访问“它指向”的对象,那么您就是段错误。相比之下,_sock_t _sock ;定义了一个_sock_t类型的对象,该对象具有一个现有字段_sock._socket。