免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5068 | 回复: 21

相当强悍的类型转换!!!!! [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-07-31 18:39 |显示全部楼层
10可用积分
A.c ,代码如下:

typedef struct _testA
{
   char name[100];
   char add[100];
} _testA;

int main()
{
   _testA *A=NULL;
    A=process();
  printf("name in main: %s",A->name);                   -----------1

   free(A);
}


B.c,代码如下:

typedef struct _testA
{
   char name[100];
   char add[100];
   char comp[100];
} _testA;

struct _testA * process()
{
    _testA *A=(_testA *)malloc(sizeof(_testA));
    memset(A,0x00,sizeof(A));
   strcpy(A->name,"UNIX");
   strcpy(A->add,"UNIX");
   strcpy(A->comp,"UNIX");

  printf("name in process : %s",A->name);                       -------2

   return A;
}

步骤:
1. B.c生成一个??.a文件
2. 接着A.c生成A.o
3. 最后A.o和??.a生成一个执行文件A

现在运行A 程序,
2打印数据为: UNIX 正确
1居然没打印出数据

注意:A.c和B.c里面A结构的不同....

太强悍了,什么原因呢?

[ 本帖最后由 chenzhanyiczy 于 2009-7-31 21:51 编辑 ]

论坛徽章:
0
发表于 2009-07-31 18:46 |显示全部楼层
确定编译能通过么?
A.c里面的_testA结构根本没有comp成员
打印name或者add还差不多

论坛徽章:
0
发表于 2009-07-31 19:00 |显示全部楼层
原帖由 peimichael 于 2009-7-31 18:46 发表
确定编译能通过么?
A.c里面的_testA结构根本没有comp成员
打印name或者add还差不多


同样持怀疑态度…… 这个代码能编译过就神奇了~

如果是LZ写帖子时笔误的话,1处没打印出信息,多半就是越界访问导致崩溃了。 不过从代码上看,打印A的成员应该不会越界,说不定又是LZ笔误……

[ 本帖最后由 kouu 于 2009-7-31 19:04 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-07-31 19:12 |显示全部楼层
当然可以,请看步骤

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-07-31 19:13 |显示全部楼层
原帖由 peimichael 于 2009-7-31 18:46 发表
确定编译能通过么?
A.c里面的_testA结构根本没有comp成员
打印name或者add还差不多



就是突出A.c里面的_testA结构没有comp成员,这样才能说明问题---- 类型转换出错

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
发表于 2009-07-31 19:30 |显示全部楼层
我编译了一下 gcc -c a.c 不能通过
还有    _testA A=malloc(sizeof(_testA));
应该是     _testA *A=malloc(sizeof(_testA));
                memset(A, 0, sizeof(*A));


lz自己先试一下再拿出来讨论

[ 本帖最后由 vbs100 于 2009-7-31 19:36 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-07-31 19:38 |显示全部楼层
知道就行了,大家不要老扣着能不能编译不放,这段代码只是想说明问题

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-07-31 19:39 |显示全部楼层
这个是我项目中出错的时候的情况,我用gdb和dbx调试过了,就定位在这种情况下

论坛徽章:
0
发表于 2009-07-31 21:03 |显示全部楼层
其实LZ举的例子和一般的类型转换没有什么不同, 只不过参与类型转换的两种类型是同名的, 增加了一点迷惑性而已...

小结构强行转换为大结构, 造成访问越界, 程序崩溃是很正常的事情... (虽然LZ的例子看上去不是这种情况)

[ 本帖最后由 kouu 于 2009-7-31 21:13 编辑 ]

论坛徽章:
0
发表于 2009-07-31 21:08 |显示全部楼层
楼主用的哪个编译器啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP