免费注册 查看新帖 |

Chinaunix

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

[C] 关于void * 类型的返回值,求助!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-10 17:41 |只看该作者 |倒序浏览
如果一个函数的返回值为void *为何可以不返回?例如如下程序
#include <stdio.h>
   
   void* func()
   {
       printf("hello\r\n");
   }
   
   int main()
   {
     func();
      return 0;
  }
利用gcc编译执行完全没有问题,为什么返回为void*的函数可以完全不用写return语句?是默认返回空指针吗?

但是修改为如下:

#include <stdio.h>
   
   void* func()
   {
       printf("hello\r\n");
   }
   
   int main()
   {
     int *p = (int *)func();
     if (NULL == p)
     {
         printf("null\r\n");
     }
     else
     {
         printf("%d\r\n", *p);
     }
      return 0;
  }
却出现segment fault,显然返回的不是空指针,求助!!

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
2 [报告]
发表于 2013-03-10 18:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
3 [报告]
发表于 2013-03-10 20:14 |只看该作者

如果一个函数的返回值为void *为何可以不返回?例如如下程序
#include <stdio.h>
   
    void* func()
    {
        printf("hello\r\n");
    }
   
    int main()
    {
      func();
       return 0;
   }
利用gcc编译执行完全没有问题,为什么返回为void*的函数可以完全不用写return语句?是默认返回空指针吗?


你编译的时候 -Wall 试一下看有不有警告呢

论坛徽章:
0
4 [报告]
发表于 2013-03-10 22:29 |只看该作者
回复 3# socay2 确实会有告警,但是为何不是error呢?


   

论坛徽章:
0
5 [报告]
发表于 2013-03-10 22:30 |只看该作者
回复 2# pmerofc 那为何这个程序编译不报错?


   

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
6 [报告]
发表于 2013-03-11 09:34 |只看该作者
这应该就是编译器不严谨的地方,SOLARIS平台上的cc编译器对于这种情况的处理是返回一个NULL指针,这样相对GCC要好一点至少给应用以回旋的余地好做返回值判断,而不会像GCC返回一个非空的非法指针。大部分时候我们不应该单单地靠编译器来约束我们的程序啊 {:3_193:}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-03-11 09:43 |只看该作者
SYS-V AMD64 ABI规定,返回值固由RAX:RDX传递,
不管你函数返回类型是void还是void *还是int *
当函数函数返回时,被调用者将返回值存入RAX:RDX,
调用者根据需要,可以提取RAX:RDX的内容作为返回值,也可以忽略返回值,

由于返回值传递过程没有使用内存,所以你那种写法只是警告而不是错误

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2013-03-11 12:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
摩羯座
日期:2013-11-14 15:56:09
9 [报告]
发表于 2013-03-11 16:19 |只看该作者
pmerofc 发表于 2013-03-11 12:10
C语言并没有要求编译器在这种情况下报错
C语言认为程序员知道自己在做什么


嗯,是这么个道理。

论坛徽章:
0
10 [报告]
发表于 2013-03-11 16:36 |只看该作者
返回值其实就是函数退出时寄存器EAX的值,如果func()函数未显式return,此时EAX中保存了prinf的返回值,那么Main函数中获取到的func函数的返回值,其实是func函数中printf的返回值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP