标题:比较诡异的问题,求教高手
只看楼主
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-326138-1-1.html




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

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