首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

char *ptr=malloc(.)申请空间有关问题

2012-11-06 
char *ptrmalloc(..)申请空间问题昨晚同学问了我两个问题,好像是面试题,[color#0000FF]我也没跟他解释清

char *ptr=malloc(..)申请空间问题
昨晚同学问了我两个问题,好像是面试题,[color=#0000FF]我也没跟他解释清楚,恳请各位高手帮忙解答下!!!!!!!
#include <stdio.h>
#include <stdlib.h>
==========================《1》=============================
帮忙看下一下这段程序为什么输出的是else后的内容?malloc申请的大小为0空间有地址返回么
int main()
{
char *ptr;
if((ptr=(char *)malloc(0))==NULL)

printf("this is null pointer \n");
else 
printf("this is a valid pointer\n");
}
============================《2》=============================
为什么输出为"world"?..之前申请的空间free后不等NULL么
void main()
{
  char *str=(char *)malloc(100);
  strcpy(str,"hello");
  free(str);
  if(str!=NULL)
  {
  strcpy(str,"world");
  printf(str);
  }
}

[解决办法]
1.
void *malloc(int size): If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free()

如果size是0, 有可能返回NULL, 也有可能返回非空. 所以属于未定义行为.

2.
free(void *): if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.
如果使用ptr之前, 已经调用过free, 属于未定义行为.
[解决办法]
1.关于malloc函数的介绍:
“如果请求的长度为0,则标准C语言函数返回[color=#FF0000]一个null指针或不能用于访问对象的非null指针[/code]”
——摘自《C语言参考手册第五版》

可见,对C标准来说,长度为0的动态内存分配是未定义行为,实际效果因编译器不同而有可能不一样。

2.这里其实是犯了个低级错误:
C语言的函数参数只有值传一种方式。
free(str);
调用不管函数内部如何操作都无法改变实参str本身的值,它仍然指向原先的地址(只是free运行过程中该内存区域被OS回收)。

热点排行