CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

昨天去笔试,碰到的一个小问题,大家探讨一下。

楼主popsmart_410108(好好学习,天天向上)2005-04-02 17:14:44 在 C/C++ / C语言 提问

char   *a;  
  a=(char   *)malloc(0);  
  if(a==NULL)  
  printf("this   is   a   NULL   pointer");  
  else    
  printf(:this   is   a   valid   pointer");  
   
  问:程序输出的结果会是什么?为什么?请简单说一下原因。  
   
  我的回答:  
  输出结果是   this   is   a   NULL   pointer  
  因为a=(char   *)malloc(0);   给a分配的空间为零,那a   应该指向NULL  
   
  请大家发表下自己的看发。  
   
   
  问题点数:40、回复次数:39Top

1 楼arrowcy(长弓手)回复于 2005-04-02 17:24:26 得分 1

我也是这么想的Top

2 楼skywgs(浪迹天涯)回复于 2005-04-02 17:27:51 得分 1

楼主是对的,分配0与未分配应该是一样的,都是NULLTop

3 楼skywgs(浪迹天涯)回复于 2005-04-02 17:29:08 得分 1

错了,未分配时是this   is   a   valid   pointerTop

4 楼tgz501(长夜雨亭)回复于 2005-04-02 17:31:38 得分 1

是这样的,在C语言中,NULL和0应该是等价的,malloc(0)即没有申请内存,因此,a==NULL   成立Top

5 楼arrowcy(长弓手)回复于 2005-04-02 17:31:42 得分 1

我用vc试了一下,怎么和你的返回结果相反呢?Top

6 楼arrowcy(长弓手)回复于 2005-04-02 17:34:41 得分 1

其实大家在这里猜测参数是0会返回什么是没有用的  
  关键要看malloc内部是怎么处理的,我不太会这个,如果谁会的话,可以看一看,或者查一下msdn也可以。  
  我刚才尝试了跟踪到malloc函数内部,最后结果还是返回了一个地址的,而且它内部还修改了分配空间的链表  
  而且我看了一下那个malloc的返回值,在我电脑上显示的是0xccccccTop

7 楼arrowcy(长弓手)回复于 2005-04-02 17:35:42 得分 1

就是用的这个程序,其实和楼主的程序是一回事  
  返回结果为:not   null  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  int   main(int   argc,   char   *argv[])  
  {  
  char   *p;  
  p=(char   *)malloc(0);  
  if(p==NULL)  
  printf("null\n");  
  else  
  printf("not   null\n");  
  }Top

8 楼xfxf521(天使也一样)回复于 2005-04-02 17:37:20 得分 1

楼主说的答案是正确的,机子上试了的!!Top

9 楼laolaoliu2002(老刘----狂热的热爱人民币)回复于 2005-04-02 17:41:00 得分 1

C语言是输出肯定this   is   a   NULL   pointer。Top

10 楼arrowcy(长弓手)回复于 2005-04-02 17:44:03 得分 1

我那个是在vc上试的Top

11 楼luchangqing(迷途中的小书童)回复于 2005-04-02 17:48:47 得分 1

我用了dev   c++也试了一次,也是this   is   a   valid   pointer,最有意思的是即使去掉a=(char   *)malloc(0);这一句,也是返回this   is   a   valid   pointer.我想应该是定义了一个指针在没有赋初值前指针指向任意的地址,赋值后指向某一个申请的地址。除非显示的将指针指向NULL,否则a==NULL永不会成立.  
   
  Top

12 楼popsmart_410108(好好学习,天天向上)回复于 2005-04-02 18:09:16 得分 0

刚拿arrowcy(长弓手)这位哥们的程序试了一下,  
  用win-tc运行了,输出是null  
  用vc运行了下,输出是not   null.  
   
  真他m的扯淡。  
   
  认真琢磨了下,要是我是标准c库函数的作者,在写malloc()函数的时候,如果形参传递的是0,  
  我肯定会把函数的返回值,置NULL。Top

13 楼zllo(cat)回复于 2005-04-02 18:13:45 得分 1

我把0改成了-1在运行中提示错误,忽略后结果是   null(没有分配空间)  
  我不会跟踪,怎么跟踪呀(在vc下的结果)Top

14 楼utstar(Universal Light)回复于 2005-04-02 18:41:27 得分 1

这个没有标准的,跟malloc函数的实现有关  
  Top

15 楼WuYL7812(龙哥)回复于 2005-04-02 19:28:57 得分 1

不会返回null吧  
  就相当于malloc(1)Top

16 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2005-04-02 19:36:17 得分 1

注意一点:  
  char*   p;  
  p   !=   NULL;//这是成立的Top

17 楼weiqian2002(暴走天使)回复于 2005-04-02 19:55:10 得分 1

应该是取决于编译器。所以最好的办法就是永远不要用0来表示null。Top

18 楼utstar(Universal Light)回复于 2005-04-02 21:48:23 得分 1

null本来就是0,c语言诞生以来一直是这么用的  
  Top

19 楼cwwwj(392-387-44-17-377)回复于 2005-04-02 21:52:35 得分 1

char   *a;   a是一个自动变量,没有被初始化,所以,a!=0Top

20 楼lrj2005(努力学习中)回复于 2005-04-02 22:08:32 得分 1

vc和tc编译不一样Top

21 楼vagrant__82(谢国庆)回复于 2005-04-02 22:41:40 得分 1

这要看各个厂家的编译器怎么实现,我在DevCpp上试验了:Not   NULL   Pointer!   不是空指针。看来这个公司的面试官也不懂啊,拿来考别人。Top

22 楼MagicCarmack(MagiC++)回复于 2005-04-02 23:56:32 得分 1

有没有人来给出个标准答案呢??  
   
   
  期待中...............Top

23 楼popsmart_410108(好好学习,天天向上)回复于 2005-04-03 01:13:55 得分 0

我查了下标准的c函数库  
  其中关于malloc是这样写的  
  malloc  
  Synopsis  
  #include   <stdlib.h>  
  void   *malloc(size_t   size);  
  Description  
  The   malloc   function   allocates   space   for   an   object   whose   size   is   specified   by   size   and   whose   value   is   indeterminate.  
  Returns  
  The   malloc   function   returns   either   a   null   pointer   or   a   pointer   to   the   allocated   space.  
  最后一句话:malloc函数返回一个NULL指针,或者指向已分配空间的指针。  
   
  我想在这里,既然没有分配空间就应该返回NULL(这是基与标准的c),这也是与tc下运行相符合的。  
  在vc中,我认为这里malloc函数可能被重新写过。  
   
  所以关于这个问题,确切的说没答案,就如   utstar(Universal   Light)说的  
  “这个没有标准的,跟malloc函数的实现有关”  
   
  Top

24 楼Pamirs()回复于 2005-04-03 01:46:11 得分 2

首先:  
      在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间。  
  其次:  
      不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B),因为malloc需要用这部分空间来维护堆上的内存块链表。所以当用户申请一块0B的空间时,malloc实际分配的空间是8B,如果用户申请的空间是X,则malloc实际分配的空间是(对齐(X)   +   8)。这也是为什么malloc分配的空间千万不能越界使用的原因:堆的内部链表结构将被破坏。Top

25 楼cppprogramlover(爱相随—)回复于 2005-04-03 02:55:30 得分 1

c标准说的那个null   pointer应该是在没有分配成功的时候返回的,分配0个字节不一定,如果标准中没有说明,就随编译器而定。否则就不是符合标准的。其实找个malloc的实现代码看就知道了。但是编译器中一般不给的,跟踪汇编不知道会不会太长了。而且很无聊。  
  Top

26 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-04-03 10:58:09 得分 1

up  
  Top

27 楼wbsyb()回复于 2005-04-03 14:12:38 得分 1

我觉得楼主说的比较对Top

28 楼cqulzg(love_cpp)回复于 2005-04-03 15:17:05 得分 1

我还是比较同意Pamirs()   的说法Top

29 楼lpg123(嘉龙)回复于 2005-04-03 17:10:10 得分 2

malloc   returns   a   void   pointer   to   the   allocated   space,   or   NULL   if   there   is   insufficient   memory   available.   To   return   a   pointer   to   a   type   other   than   void,   use   a   type   cast   on   the   return   value.   The   storage   space   pointed   to   by   the   return   value   is   guaranteed   to   be   suitably   aligned   for   storage   of   any   type   of   object.   If   size   is   0,   malloc   allocates   a   zero-length   item   in   the   heap   and   returns   a   valid   pointer   to   that   item.   Always   check   the   return   from   malloc,   even   if   the   amount   of   memory   requested   is   small.  
  这是从MSDN上面查到的,:)  
   
  Top

30 楼bluebroad(bluesky)回复于 2005-04-03 19:55:11 得分 1

这与malloc函数无关,char   *a就表示定义了一个指针变量,此时a就是一个变量,如同int   a,   这个变量占4个字节,里面存储的是地址,所以不论malloc是否分配了内存,a作为一个变量都不是NULL。Top

31 楼bluebroad(bluesky)回复于 2005-04-03 19:58:07 得分 1

不好意思,理解错了,a的值应该与malloc的函数返回情况有关。Top

32 楼21cnbao(月影孤鸿)回复于 2005-04-03 19:58:52 得分 1

char   *a;//改为这条语句后讨论   char   *a=NULL;  
  a=(char   *)malloc(0);  
  if(a==NULL)  
  printf("this   is   a   NULL   pointer");  
  else    
  printf(:this   is   a   valid   pointer");Top

33 楼mensa(Talor)回复于 2005-04-03 20:35:14 得分 1

晕了,在TC下是NULL,在DEVC++下是NOT   NULL。Top

34 楼szwpc(风色鸟)回复于 2005-04-03 20:56:49 得分 1

这个,是不是好像要看编译器了啊?  
  但是,这个程序本身有意义吗?Top

35 楼cugliang(雨帘)回复于 2005-04-03 21:29:49 得分 1

这应该和编译器有关的  
  但是0不代表就是null  
  虽然null=0  
  malloc(0)是会返回值的Top

36 楼flying_dancing(小混混-_-)回复于 2005-04-03 21:51:23 得分 1

用   arrowcy(长弓手)运行了一下       发现和他的结果一样  
  但到p=(char   *)malloc(0);       调试下MALLOC   RETURN   0x004300e0  
  我也赞同楼主的想法,虽然我是才才鸟........    
  Top

37 楼cpusoft()回复于 2005-04-03 21:51:27 得分 2

VC6下跟踪下去就知道了  
  _CRTIMP   void   *   __cdecl   malloc(size_t   nSize)     //nSize   =   0  
  {  
                  return   _nh_malloc_dbg(nSize,   _newmode,   _NORMAL_BLOCK,   NULL,   0);  
  }  
   
  再走下去,就注意nSize,其他参数先忽略  
  void   *   __cdecl   _nh_malloc_dbg   (size_t   nSize,...)//  
  {  
      void   *   pvBlk;  
      for   (;;)  
      {  
          ....//发现关键在pvBlk,接着再跟踪下去  
            pvBlk   =   _heap_alloc_dbg(nSize,   nBlockUse,   szFileName,   nLine);  
            if   (pvBlk   ||   nhFlag   ==   0)  
                          return   pvBlk;  
        ....  
      }  
  }  
  //nSize   =   0  
  void   *   __cdecl   _heap_alloc_dbg(size_t   nSize,...           )  
  {  
          _CrtMemBlockHeader   *   pHead;   //这是返回值  
          ....  
          //关键就在这里,nSize=0,但blockSize确肯定不会=0          
          blockSize   =   sizeof(_CrtMemBlockHeader)   +   nSize   +   nNoMansLandSize;  
          //看到了,起作用的是blockSize>0,所以pHead肯定要分配内存的  
          pHead   =   (_CrtMemBlockHeader   *)_heap_alloc_base(blockSize);  
          ....  
  }  
   
  跟踪下来发现,即使malloc(0),但实际分配的时blockSize是大于0的,所以不会=   NULL  
  这只是VC6,下的,其他编译器可能有不同处理会=NULL的  
   
   
  Top

38 楼lgsnake(流哥)回复于 2005-04-03 23:25:32 得分 1

呵呵,其实看看msdn吧  
  Allocates   memory   blocks.  
   
  void   *malloc(  
        size_t   size    
  );  
  Parameter  
  size    
  Bytes   to   allocate.    
  Return   Value  
  malloc   returns   a   void   pointer   to   the   allocated   space,   or   NULL   if   there   is   insufficient   memory   available.   To   return   a   pointer   to   a   type   other   than   void,   use   a   type   cast   on   the   return   value.   The   storage   space   pointed   to   by   the   return   value   is   guaranteed   to   be   suitably   aligned   for   storage   of   any   type   of   object.    
   
  If   size   is   0,   /////////////////////////  
  malloc   allocates   a   zero-length   item   in   the   heap   and   returns   a   valid   pointer   to   that   item.   Always   check   the   return   from   malloc,   even   if   the   amount   of   memory   requested   is   small.  
   
  Top

39 楼coldcrane(清风明月)回复于 2005-04-04 00:35:50 得分 1

c/c++的标准,即使malloc和new申请的内存大小为0,也必须返回一个有效指针。  
  这是c/c++的标准!掌握这个概念就够了。Top

相关问题

  • 我最近碰到的一些笔试题目
  • 昨天IBM笔试有人去吗?
  • 问一道昨天威盛笔试题
  • 昨天阿里巴巴笔试题(zz)
  • 今天在学校的招聘会上笔试碰到的几个问题
  • 讨论一下昨天微软的一道笔试题
  • 昨天西门子的一道笔试题
  • 昨天笔试的一个改错题,百思不得其解
  • 昨天微软笔试的一道题目
  • 昨天去公司笔试的时候的一道题目。。求教

关键词

  • c/c++
  • 函数
  • 编译器
  • 指针
  • 内存
  • malloc
  • 分配
  • pvblk
  • 返回
  • 变量

得分解答快速导航

  • 帖主:popsmart_410108
  • arrowcy
  • skywgs
  • skywgs
  • tgz501
  • arrowcy
  • arrowcy
  • arrowcy
  • xfxf521
  • laolaoliu2002
  • arrowcy
  • luchangqing
  • zllo
  • utstar
  • WuYL7812
  • darkstar21cn
  • weiqian2002
  • utstar
  • cwwwj
  • lrj2005
  • vagrant__82
  • MagicCarmack
  • Pamirs
  • cppprogramlover
  • sankt
  • wbsyb
  • cqulzg
  • lpg123
  • bluebroad
  • bluebroad
  • 21cnbao
  • mensa
  • szwpc
  • cugliang
  • flying_dancing
  • cpusoft
  • lgsnake
  • coldcrane

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo