为什么此代码会导致分段错误或代码崩溃?

时间:2017-10-27 17:12:21

标签: c

 #include <stdio.h>

 struct p
 {
   int x[2];
 };

 struct q
 {
   int *x;
 };

 int main()
 {
   struct p p1 = {1, 2};
   struct q *ptr1;
   ptr1->x = (struct q*)&p1.x;
   printf("%d\n", ptr1->x[1]);
 }

我没有得到此代码的输出,并且发生了分段错误。这条代码或整个代码错误的哪一行是错误的?

2 个答案:

答案 0 :(得分:2)

struct q *ptr1;
ptr1->x = (struct q*)&p1.x;

已创建指针ptr1,但从未初始化。第二行尝试取消引用指针。由于指针从未初始化并包含垃圾,因此第二行取消引用无效的内存地址。在执行第二行之前,您需要分配struct q并使ptr1指向它。

答案 1 :(得分:0)

这里的人已经指出了,但只是把它放在实际的示例代码中:

int main()
{
  struct p p1 = {1, 2};
  struct q q1;                  // reserve memory on stack
  struct q *ptr1 = &q1;         // let ptr1 point to it
  ptr1->x = (struct q*)&p1.x;   // cleaner: q1.x = p1.x; both are pointer to int
  printf("%d\n", ptr1->x[1]);
}

我不能100%确定p1 = {1, 2}是否应该是p1 = { {1, 2} },因为前者也可以用于例如。{/ p>

struct {
  int a;
  int b;
} P1 = {1, 2};