免费注册 查看新帖 |

Chinaunix

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

求sizeof(f)大小的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-24 15:31 |只看该作者 |倒序浏览
  1. int f() {
  2.     return 0;
  3. }

  4. main()
  5. {
  6.     printf("%lu\n", sizeof(f));
  7. }
复制代码
输出结果为1。
个人认为f是函数名,表示的是函数地址,在32位机上应该是4呀。
求大家指点

论坛徽章:
0
2 [报告]
发表于 2011-08-24 16:35 |只看该作者
好像不能对函数名进行sizeof()运算。

论坛徽章:
0
3 [报告]
发表于 2011-08-24 16:44 |只看该作者
我用gcc编译能通过,也没警告。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2011-08-24 17:08 |只看该作者
本帖最后由 zylthinking 于 2011-08-24 17:09 编辑

咦, 真的也。
啥意思?
符号表这类东西是不是应该呼唤编译原理大拿? c标准能有条款解释吗

论坛徽章:
0
5 [报告]
发表于 2011-08-24 17:12 |只看该作者
本帖最后由 davidfoxhu 于 2011-08-24 17:14 编辑

C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值;
sizeof是在编译时确定的,不是运行时确定;
把你的代码输出成汇编,结果如下:
        .file        "main.c"
        .text
.globl f
        .type        f, @function
f:
        pushl        %ebp
        movl        %esp, %ebp
        movl        $0, %eax
        popl        %ebp
        ret
        .size        f, .-f
        .section        .rodata
.LC0:
        .string        "%d\n"
        .text
.globl main
        .type        main, @function
main:
        pushl        %ebp
        movl        %esp, %ebp
        andl        $-16, %esp
        subl        $16, %esp
        movl        $.LC0, %eax
        movl        $1, 4(%esp)                      ;这里根本就不计算,直接赋值1,跟函数f也没任何关系
        movl        %eax, (%esp)
        call        printf
        movl        $0, %eax
        leave
        ret
        .size        main, .-main
        .ident        "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
        .section        .note.GNU-stack,"",@progbits

论坛徽章:
0
6 [报告]
发表于 2011-08-24 17:21 |只看该作者
按规范去理解是对的,但拿汇编代码来解析就有问题了,
准确来说,sizeof应该是预处理阶段就处理掉了,到了汇编阶段就没有任何关系了
写个sizeof(char),汇编代码一样会是:

movl        $1, 4(%esp)                      ;这里根本就不计算,直接赋值1,跟字符类型char也没任何关系

论坛徽章:
0
7 [报告]
发表于 2011-08-24 17:36 |只看该作者
sizeof(&f)

论坛徽章:
0
8 [报告]
发表于 2011-08-24 18:05 |只看该作者
本帖最后由 cjxgm 于 2011-08-24 18:09 编辑

函数是函数,函数指针是函数指针,不一样的
  1. cjxgm@clans /tmp$ cat a.c

  2. #include <stdio.h>

  3. void f(void) {}

  4. int main(void)
  5. {
  6.         printf("func: %d\nfunc ptr: %d\n",
  7.                         sizeof(f), sizeof(&f));
  8.         return 0;
  9. }

  10. cjxgm@clans /tmp$ gcc -o a a.c
  11. cjxgm@clans /tmp$ ./a
  12. func: 1
  13. func ptr: 4
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-08-24 18:54 |只看该作者
回复 8# cjxgm


但若把f和&f的地址打出来是一样的
  1. printf("%p\n%p\n", f, &f);
复制代码
在我机器上都是:
0x4004f4
0x4004f4

论坛徽章:
0
10 [报告]
发表于 2011-08-24 19:33 |只看该作者
回复  cjxgm


但若把f和&f的地址打出来是一样的在我机器上都是:
0x4004f4
0x4004f4
zmdesperado 发表于 2011-08-24 18:54



    8楼说的是类型不一样,说的不是值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP