免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3462 | 回复: 13
打印 上一主题 下一主题

[C] 请问:关于指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-11 10:56 |只看该作者 |倒序浏览
本帖最后由 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 赋值啊?

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
2 [报告]
发表于 2010-09-11 11:06 |只看该作者
很简单的代码,你是不是语法不对啊?

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

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

论坛徽章:
0
3 [报告]
发表于 2010-09-11 11:11 |只看该作者
回复 2# fender0107401


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

论坛徽章:
0
4 [报告]
发表于 2010-09-11 11:16 |只看该作者
这是什么烂代码 看的都恶心

论坛徽章:
0
5 [报告]
发表于 2010-09-11 11:21 |只看该作者
回复 4# gtv


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

论坛徽章:
0
6 [报告]
发表于 2010-09-11 11:23 |只看该作者
本帖最后由 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. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-09-11 11:35 |只看该作者
回复 6# gtv


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

论坛徽章:
0
8 [报告]
发表于 2010-09-11 11:46 |只看该作者
有点绕,你把  s.p[1] = 1;   复制后 你可以看看此时的s.p是多少?下一步的s.p[0]访问又是依赖于s.p[1]=1后的p值 所以访问了不该访问的地址

论坛徽章:
0
9 [报告]
发表于 2010-09-11 12:05 |只看该作者
缠 的头都大了。就是整个指针来回指。不知道这题有什么意义。

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
10 [报告]
发表于 2010-09-11 14:18 |只看该作者
这代码,确实没啥意思啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP