| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2976 人关注过本帖
标题:用 sizeof 输出变长数组长度,结果为 0 ?
只看楼主 加入收藏
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
收藏
 问题点数:0 回复次数:9 
用 sizeof 输出变长数组长度,结果为 0 ?
我把n改成100,马上输出正确值100,这说明sizeof对定长数组是这样用的。

//直接上代码

程序代码:
    int n = 0;
    char a[n];    //定义一个变长数组,接收字符输入
    char *p = a;
    char ch;

    printf("Enter a message: ");
    ch = getchar();
    while (ch != '\n'){        //将输入的字符放到数组中
        n++;
        *p = ch;
        p++;
        ch = getchar();
    }

    printf("%d\n", sizeof(a));    //这里输出的数值应该是输入的字符的个数,可是为什么输出是0呢?(sizeof(char)的值是1,就不去除他了)

2014-09-26 13:16
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
变长数组是不完全数据类型,sizeof也不知道他的长度。
翻译:变长数组的长度就像盒子里的巧克力,sizeof也不知道下一块是什么味。
2014-09-26 13:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你的想法也太神奇了吧
a是变长数组,而非动态数组;即使是动态数组,也无法通过指向第一个元素的指针p去动态改变其尺寸呀。
2014-09-26 13:27
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 3 楼 rjsp
从才没用p去改变他的尺寸呢,我用n去改变他的尺寸,哈哈
2014-09-26 13:37
lwei
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:197
专家分:369
注 册:2005-5-4
收藏
得分:0 
  int n = 0;
    char a[n];    //定义一个变长数组,接收字符输入
这样的化sizeof输出0很正常啊!难道你认为当你向a赋值的时候会自动增加数组的长度?
 n++;  是不是以为执行这一句后你认为a[n]应该是a[1]了,如果是这样的话,只能说,你的理解完全错了。
事实上在char a[n]之后,a和n已经没有任何关系了。不管你把n改成任何数值,这个数组也不会变化的。

2014-09-26 13:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
变长数组是不完全数据类型,sizeof也不知道他的长度。
翻译:变长数组的长度就像盒子里的巧克力,sizeof也不知道下一块是什么味。
--------------------------------------
这话你从哪里听来的?变长数组属于complete type,sizeof在“运行时”知道其尺寸。
我猜原话中的『变长数组』指的是这种
struct foo {
    ……
    int vv[0];
};
也就结构体尾部定义一个空数组,由用户自己决定这个结构体的实际长度。
2014-09-26 13:52
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 6 楼 rjsp
变长数组是不完全数据类型,不能使用sizeof获得它的大小。
来自:http://blog.  《例解GNU C之零长数组与变长数组》

C/C++中的不完全类型[编辑]
C/C++中不完全类型有三种不同形式: void、未指定长度的数组以及具有非指定内容的结构和联合。使用不完全类型的指针或引用,不需要知道类型的全部内容。另外也用于解决对象类型及其成员之间的类型循环依赖。
来自: http://zh. 《不完全类型》
2014-09-26 14:41
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 5 楼 lwei
那我就用n标记数组的长度好了,不然我也不知道数组有多长
2014-09-26 14:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 7 楼 muyoucumian
第一个链接,你声明了一个“变长数组的不完全类型”,而不是说“变长数组”就是不完全类型。
比如 struct foo; 此时 strcut foo 就是个 incomplete type,但不能说 struct 就是 incomplete type。

第二个链接,同上,说的是“未指定长度的数组”,不能因为 VLA可以不指定长度 就认为VLA是不完全类型。你想想呀,普通函数声明时也是可以不指定长度的,难道说普通函数也是不完全类型。
BTW:wiki上的“具有非指定内容的结构和联合”,最好改为“具有指定内容的结构和联合”
2014-09-26 15:26
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
C 语言不允许 int n=8; int a[n];这么使用的。
所以再讨论sizeof(a)输出什么就意思不大了
2014-09-26 21:05
快速回复:用 sizeof 输出变长数组长度,结果为 0 ?
数据加载中...
 
   



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

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