+ -
当前位置:首页 → 问答吧 → 请问:关于指针

请问:关于指针

时间:2010-09-11

来源:互联网

本帖最后由 spxjtu 于 2010-09-11 11:16 编辑

struct  S{
  int    i;
  int    *p;
};

int main(void)
{
      struct S  s;
      int *p = &s.i;

     p[0] = 4;                   -------------1
    p[1] = 3;                   --------------2

    s.p = p;

     s.p[1] = 1;              ------------3
    s.p[0] = 2;               -------------4
}
第3步是将指针要指的地址赋成了1,可以理解。
程序在第4步会core掉,为什么?第4步为什么不是给结构体的i 赋值啊?

作者: spxjtu   发布时间: 2010-09-11

很简单的代码,你是不是语法不对啊?

我总是记不住是应该用“.”还是用“->”,

你用调试器看一下很容易就搞定了。

作者: fender0107401   发布时间: 2010-09-11

回复 fender0107401


    不是语法错误啊,是第4步引用了无效的内存。3,4步交换一下程序就就没事了。

作者: spxjtu   发布时间: 2010-09-11

这是什么烂代码 看的都恶心

作者: gtv   发布时间: 2010-09-11

回复 gtv


    书上看的微软面试题。恶心完了能否帮忙解释一下?多谢了。

作者: spxjtu   发布时间: 2010-09-11

本帖最后由 gtv 于 2010-09-11 11:27 编辑

你的第二步第三步都等同于把指针值赋成了0x0000002/3 指向了保护区地址 肯定蹦掉 去掉2,3运行正常
win7下gcc测试
  1. int main()
  2. {
  3.     struct S  s;
  4.     int a = 5;
  5.     printf("a init addr is %p\n",&a);
  6.     printf("s addr is %p\n",&s);
  7.    int *p = &s.i;
  8.     printf("p is %p\n",p);
  9.      p[0] = 4;
  10.      printf("s.i is %d\n",s.i);
  11.    // p[1] = &a;
  12.     s.p = p;

  13.     s.p[1] = &a ;
  14.     s.p[0] = 2;
  15.       printf("s.i is %d\n",s.i);
  16.        printf("s.p is %p\n",s.p);
  17. }
复制代码

作者: gtv   发布时间: 2010-09-11

回复 gtv


    2,3步把指针自己的值写成了3和1应该没问题吧,因为没有执行取值。我这边是第4步蹦了,2,3步正常。

作者: spxjtu   发布时间: 2010-09-11

有点绕,你把  s.p[1] = 1;   复制后 你可以看看此时的s.p是多少?下一步的s.p[0]访问又是依赖于s.p[1]=1后的p值 所以访问了不该访问的地址

作者: gtv   发布时间: 2010-09-11

缠 的头都大了。就是整个指针来回指。不知道这题有什么意义。

作者: zhangsuozhu   发布时间: 2010-09-11

相关阅读 更多