#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]);
}
我没有得到此代码的输出,并且发生了分段错误。这条代码或整个代码错误的哪一行是错误的?
答案 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};