70,014
社区成员




struct S
{
int i;
int *p;
};
main()
{
S s;
int *p = &s.i;
p[0] = 4;
p[1] = 3;//这里不清楚,应为有int *p = &s.i;指向了一个 int值,应该不能这么写
s.p = p;
s.p[1] = 1;//等同于s.*(p+1)=1,也就是说p指向的数组元素的一号的值等于1
s.p[0] = 2;//同上
}
struct S {
int i;
int *p;
};
int main()
{
struct S s;
int *p = &s.i; /*指针p指向结构体s中的成员i*/
p[0] = 4; /*给结构体s中的成员i赋值, 相当于s.i=4*/
printf("s.i=%d\n", s.i);
p[1] = 3; /*相当于s.p=3*/
printf("s.p=%p\n", s.p);
s.p = p; /*相当于s.p=&s.i*/
/*s.p[1] = 1; *//*注意顺序, 如果赋值放在这里, 后面的赋值将会报空指针异常,因为这样相当于s.p=1, 后面s.p[0] = s.p=1, sp将不会再指向s.i*/
s.p[0] = 2;/*这里相当于s.i=2*/
s.p[1] = 1;/*这里相当于s.p=1*/
printf("s.p=%p\n", s.p);
printf("s.i=%d\n", s.i);
return 0;
}
struct S
{
int i[2]; // 这样就对了,不然数组越界。
int *p;
};
int main()
{
S s;
int *p = &s.i[0];
p[0] = 4;
p[1] = 3; // p[1] 相当于 *(p+1)
s.p = p;
s.p[0] = 2;
s.p[1] = 1;
return 0;
}
struct S
{
int i;
int *p;
};
main()
{
S s;
int *p = &s.i;
p[0] = 4; //把i的值改为4
p[1] = 3;//这个地方越界写了,把保存在int i下面的指针int* p的值给写为3了
s.p = p; //又把这个指针s中指针p的值赋为上面int i的地址
s.p[1] = 1;//i下面的指针指向i的地址,现在把自身修改为1了
s.p[0] = 2;//再访问内容为1的指针所指空间就出错了,这行崩溃了
}