| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 434 人关注过本帖
标题:求助 指针和结构体的混合使用
只看楼主 加入收藏
swyjpbzdy
Rank: 1
等 级:新手上路
帖 子:8
专家分:6
注 册:2010-1-29
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
求助 指针和结构体的混合使用
#include <stdio.h>
struct S{
int a;
int *b;
};
int main(void)
{
    struct S s;
    int *p;
    p=&s.a;
    p[1]=2;   
    p[0]=1;
    printf("%d,%d\n",s.a,s.b);
    s.b=p;
    s.b[1]=4;
    s.b[0]=3;
    printf("%d,%d\n",s.a,s.b);
}
这个程序运行出错,这个问题我想了很久,只知道是s.b[1]=4时出了问题,但具体搞不清楚为什么,有没高手帮解释下?
搜索更多相关主题的帖子: 结构体 指针 
2010-01-29 10:23
xinjinlong
Rank: 3Rank: 3
来 自:河南南阳
等 级:论坛游侠
帖 子:61
专家分:117
注 册:2010-1-19
收藏
得分:20 
程序代码:
#include <stdio.h>
struct S{
int a;
int *b;
};
int main(void)
{
    struct S s;
    int *p;
    p=&s.a;
    p[1]=2;   
    p[0]=1;
    printf("%d,%d\n",s.a,s.b);
    /*s.b=p;
    s.b[1]=4;
    s.b[0]=3;
    printf("%d,%d\n",s.a,s.b);*/
}
红色地方错误的原因在于在结构体和主函数中程序仅仅是定义了一个指针就是说仅仅分配了一个指针(4B)的大小,只是一个地址并没有分装配数值的空间;
s.b=p;//这句话是对的但是后面的是错误的,因为你没有分配的空间
p=&s.a;p[1]=2;p[0]=1;实际上也不对,但是歪打正着对了,因为结构体的大小恰好是两个整数的大小空间相等,你可以加一个p[2]=x,绝对也回出现同样错误
所以错误的根源在于:
struct S{
int a;
int *b;
};
struct S{
int a;
int b[];
};
所占的空间大小是不相等的!
2010-01-29 11:03
swyjpbzdy
Rank: 1
等 级:新手上路
帖 子:8
专家分:6
注 册:2010-1-29
收藏
得分:0 
回复 2楼 xinjinlong
你的意思我不是非常明白
你的意思是不是在执行s.b=p;之后执行无论是执行s.b[1]=4;,
还是执行s.b[0]=3都是错的呢?
我后来想了下 你看是不是这样的
比如  执行struct S s;int *p;后  
       地址     内容
s.a  200      ?
s.b  204      ?
p     300      ?
执行p=&s.a后
p     300      200
执行p[1]=2;p[0]=1;后
s.a   200    1
s.b   204    2
p      300    200
执行s.b=p;后
s.a   200    1
s.b   204    200
p      300    200
执行s.b[1]=4;后
s.a   200    1
s.b   204    4
执行s.b[0]=3;时,相当于*(s.b+0)=3,相当于修改地址为4的内存中的值等于3,超出
访问范围
2010-01-29 13:46
xinjinlong
Rank: 3Rank: 3
来 自:河南南阳
等 级:论坛游侠
帖 子:61
专家分:117
注 册:2010-1-19
收藏
得分:0 
对,你这样分析更让人明白,有空多讨论!
2010-01-29 17:01
快速回复:求助 指针和结构体的混合使用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049915 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved