【问题标题】:Structure pointer member pointing to another structure leads to segmentation fault (C/C++) [duplicate]指向另一个结构的结构指针成员导致分段错误(C/C++)[重复]
【发布时间】: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

标签: c++ c pointers structure


【解决方案1】:

这不足为奇。在编写_sock_t *_sock 时,您所做的只是声明一个指针。

但它并没有指向任何东西。 取消引用它的行为(在你的情况下通过指向成员运算符->的指针)是未定义

您需要将其指向分配的内存。在 C 中为此使用 malloc,在 C++ 中使用 new。完成指针后不要忘记分别调用 freedelete,否则会泄漏内存。

最后,(确认@Karthick),您似乎正在使用 C++ 编译器来编译 C 代码:在 C 中您需要编写 struct _sock_t *_sock;

【讨论】:

  • “类型”这个词是多余的IMO。
  • @barakmanos:是的,我认为你是对的;没有它读起来会更好。
  • 我已经尝试过_sock_t *_sock=NULL,但没有成功。我应该试试_sock_t *_sock = malloc(sizeof(_sock_t));吗?
  • 绝对!完成_sock 后不要忘记致电free
  • _sock_t *_sock ; 这个声明有效吗?由于 typedef 在结构中使用,此语句可能无效。
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 2018-04-25
  • 2014-06-09
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多