免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: spxjtu
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2010-09-11 14:44 |只看该作者
回复 1# spxjtu


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

从 S 的定义来看,它至少占两个int的大小(sizeof(int*) >= sizeof(int) ).

    int *p = &s.i;

相当于p只想s的首地址,也即至少两个int 大小的内存,故而,p[0] = 4; p[1] = 3; 这两个语句没有问题。


    s.p = p;

相当于s.p 指向s的首地址,s.p[0] 就是s.i占的内存,s.p[1]占的内存就是s.p占的内存,先赋值 s.p[1] = 1; 相当于让s.p指向0x01,此时再操作 s.p[0] = 2; 当然会内存越界,就core了

改成
    s.p[0] = 2;
    s.p[1] = 1;

上下调换一下为止,在s.p还指向s时赋值s.p[0]这样没问题。

另外,我觉得这种问题,没有多大实际的意思。但是对人理解c语言是大有裨益的。

论坛徽章:
0
12 [报告]
发表于 2010-09-11 14:56 |只看该作者
不懂

论坛徽章:
0
13 [报告]
发表于 2010-09-11 17:07 |只看该作者
s.p[1] 在第三步把s.p赋值成1了
然后s.p[0]=s.p=1,往内存地址1里面写东西,自然core掉

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


    不是语法错误啊,是第4步引用了无效的内存。3,4步交换一下程序就就没事了。
spxjtu 发表于 2010-09-11 11:11



    你自己都知道了引用了无效的内存,还问。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP