免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7228 | 回复: 37
打印 上一主题 下一主题

[已解决]对函数执行sizeof操作为什么会是这样的结果 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-26 19:15 |只看该作者 |倒序浏览
看到前面有人代码里对函数进行sizeof操作,有点疑惑,所以自己写了段测试代码,如下

  1. #include <stdio.h>

  2. int fun1(int a)
  3. {
  4.         printf("in fun1(): %d\n", a);
  5.         return 0;
  6. }

  7. float fun2(int a)
  8. {
  9.         printf("in fun2(): %d\n", a);
  10.         return 0.0;
  11. }

  12. void fun3(int a)
  13. {
  14.         printf("in fun2():%d\n", a);
  15.         return;
  16. }


  17. int main(void)
  18. {
  19.         printf("%d\n", sizeof(fun1(10)));
  20.         printf("%d\n", sizeof(fun2(10)));
  21.         printf("%d\n", sizeof(fun3(10)));

  22.         return 0;
  23. }
复制代码


运行结果显示
4
4
1
为什么返回void类型的和返回int,float的函数执行sizeof结果不一样呢

[ 本帖最后由 zhuhefang2006 于 2009-1-2 23:56 编辑 ]

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
2 [报告]
发表于 2008-12-26 20:48 |只看该作者
sizeof()对float和int之类的求值没有什么.
sizeof()对void求值因该是非法的.有一些老的编译器对void求sizeof结果是1.

论坛徽章:
0
3 [报告]
发表于 2008-12-26 21:25 |只看该作者

回复 #2 egmkang 的帖子

编译这段代码是没有警告的,说明 sizeof(void) 是合法的,其值是 1 。

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
4 [报告]
发表于 2008-12-26 22:05 |只看该作者

回复 #3 samon_fu 的帖子

在C里 sizeof(void)不正确吧
编译这段代码是没有警告的 只能说明这个编译器的实现是这样的

论坛徽章:
0
5 [报告]
发表于 2008-12-26 22:29 |只看该作者

回复 #4 yecheng_110 的帖子


  1. [root@root]# gcc -v
  2. Reading specs from /usr/lib/gcc-lib/i386-kylin-linux/3.2.3/specs
  3. Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-kylin-linux
  4. Thread model: posix
  5. gcc version 3.2.3 20030502 (CS2C Linux 3.2.3-34)
  6. [root@root]#

复制代码


我的编译器版本。

我的编译器版本并不高,如果需要搞清楚sizeof这个区别于C语言与C编译器中不同的问题,可能得到gcc里面去查了,我是指相关的文档里。

论坛徽章:
0
6 [报告]
发表于 2008-12-27 02:19 |只看该作者
原帖由 zhuhefang2006 于 2008-12-26 03:15 发表
看到前面有人代码里对函数进行sizeof操作,有点疑惑,所以自己写了段测试代码,如下

#include

int fun1(int a)
{
        printf("in fun1(): %d\n", a);
        return 0;
}

float fun2(int a)
{
        printf(" ...


不是对函数,是对函数的返回值取sizeof。

评分

参与人数 1可用积分 +5 收起 理由
langue + 5 我很赞同

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2008-12-27 13:59 |只看该作者
6 楼正解。
有关 void 类型的问题,可以参考 2 楼。

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
8 [报告]
发表于 2008-12-27 14:26 |只看该作者
printf("%d\n", sizeof(void));
--------
out:
1
***********************
gcc version 4.3.2 (4.3.2-tdm-1 for MinGW)

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
9 [报告]
发表于 2008-12-27 14:33 |只看该作者
原帖由 samon_fu 于 2008-12-26 21:25 发表
编译这段代码是没有警告的,说明 sizeof(void) 是合法的,其值是 1 。


本身从字面意思上面理解都是不合法的.都是void了,怎么还会有大小??
gcc 4.3.x下面把void直接解释成1了,但是我的VC 8.0下面下面编译就是有错误的.
这种代码还是不要写的好.

[ 本帖最后由 egmkang 于 2008-12-27 14:34 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-12-27 15:15 |只看该作者
原帖由 egmkang 于 2008-12-27 14:33 发表


本身从字面意思上面理解都是不合法的.都是void了,怎么还会有大小??
gcc 4.3.x下面把void直接解释成1了,但是我的VC 8.0下面下面编译就是有错误的.
这种代码还是不要写的好.

搭车问个问题,对于void *类型的加减和char *类型相同,到底是编译器处理还是C标准规定?
在VC下void *类型加1是不是也是加一个字节?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP