| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 495 人关注过本帖
标题:比较诡异的问题,求教高手
只看楼主 加入收藏
Spygg
Rank: 5Rank: 5
等 级:职业侠客
帖 子:135
专家分:394
注 册:2007-5-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
比较诡异的问题,求教高手
/* Note:Your choice is C IDE */
#include "stdio.h"
struct t
{
    char a;
    char table[0]; //这个为什么可以这样定义?
}tt;

void main()
{
    tt.table[100]=5;  //这个为什么可以是table[100]
    printf("%d,%d",tt.table[100],sizeof(tt));//这个大小为什么是1
}
搜索更多相关主题的帖子: include choice 
2010-11-18 16:01
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
#include "stdio.h"
struct t
{
    char a;
    char table[0]; //这个为什么不可以这样定义?
}tt;

void main()
{
    tt.table[100]=5;  //这个为什么不可以是table[100]
    printf("%d,%d",tt.table[100],sizeof(tt));//这个大小为什么不是1
}
2010-11-18 16:25
cq7610
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:28
专家分:111
注 册:2010-11-17
收藏
得分:10 
我来理解一下,错了,请大家勿笑。:)

table[0]说明是字符数组的第一个元素,也就是数组的首地址,你可以理解成指针。指针是可以跨过界线,访问自己不该访问的地方。由于只是一个字节大小,所以暂时能正常运行,我相信反复的运行,总会访问禁区,从而导致程序出错。
2010-11-18 17:16
Spygg
Rank: 5Rank: 5
等 级:职业侠客
帖 子:135
专家分:394
注 册:2007-5-20
收藏
得分:0 
回复 3楼 cq7610
有点道理,但是这个是linux内核中的代码这么定义的,所以....
2010-11-18 17:25
Spygg
Rank: 5Rank: 5
等 级:职业侠客
帖 子:135
专家分:394
注 册:2007-5-20
收藏
得分:0 
回复 2楼 wujieru
?
2010-11-18 17:25
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:10 
回复 楼主 Spygg
数组名就是数组的首地址,就是指针。所以tt.table[100]=5; 这个语句没有问题。只是这样做事危险的。
sizeof(tt)就跟sizeof(int),根据你定义的结构体结果就应该是1

南国利剑
2010-11-18 17:41
dd576503061
Rank: 1
来 自:西安
等 级:新手上路
帖 子:7
专家分:3
注 册:2010-9-17
收藏
得分:0 
对于数组来说,编译器不会检查分配单元大小,即使是越界访问也是由程序员控制的。这个大家可以试试,编译器是不会控制数组大小的,楼上的说法我觉得有些道理,但是也不全是这样子的,因为测试出来tt大小是1,表示编译器认为只给a分配了大小,table没有分配大小,还是按照数组处理的。实际情况中,数组的大小在声明的时候必须大于0,所以对于这个问题大家可以讨论讨论,不要当作可以学习多少东西来看,具体处理方式还是因不同的编译器会有不同~
2010-11-18 17:47
快速回复:比较诡异的问题,求教高手
数据加载中...
 
   



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

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