昨天去笔试,碰到的一个小问题,大家探讨一下。
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




