关于malloc、malloc(0)及一个字符串翻转函数

来源:互联网 发布:手机淘宝开店加载不了 编辑:程序博客网 时间:2024/05/16 08:40

1.关于malloc:

   malloc是c语言实现动态内存管理的标准函数库之一,与c++、c#中的new关键字使用方法类似。返回值为void *(通用类型指针)类型,需要强制转换为其他类型的指针

  工作机制  
   malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表,即所谓的空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。 

2.下面这个程序的输出结果是?为什么?

if((ptr=(char *)malloc(0))==NULL)
  puts("Got a null pointer");
else
  puts("Got a valid pointer");

首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,就是说返回给你的指针是不能用的,感觉奇怪吧?但是从操作系统的原理来解释就不奇怪了,这要涉及操作系统维护内存的方法来说了,在内存管理中,内存被分为2部分,栈和堆,栈有自己的机器指令,是一个先进后出的数据结构,我就在这里不再过多解释了,malloc分配的内存是堆内存,由于堆没有自己的机器指令,所以要有系统自己编写算法来管理这片内存,通常的做法是用链表,在每片被分配的内存前加个表头,里面存储了被分配内存的起始地址和大小,你的malloc返回的就是表头里的起始指针,这个地址是由一系列的算法得来了,通常不会为0,一旦分配成功,就返回一个有效的指针,对于分配0空间来说,算法已经算出可用内存的起始地址,但是你占用0空间,所以对那个指针操作就是错误的,操作系统一般不知道其终止地址,因为有占用大小就可以推出终止地址,还有就是即使分配0空间也要释放它,其实是释放的链表结点

还有,返回的指针是可用地址的起始地址,虽然你可以无限赋值,但是其实是错误的,因为可能有其他有用的数据在那一片区域,如果指针越界就会出现意想不到的事情。

3.请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

#include"string.h"
int main()
{
 char*src="hello,world";
   char* dest=NULL;
 int len=strlen(src);
 dest=(char*)malloc(len);
   char* d=dest;
 char* s=src[len];
 while(len--!=0) 
 d++=s--;
 printf("%s",dest);
 return 0;

答:
int main()

{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为\0分配一个空间
char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露

dest=NULL;//防止野指针
return 0;
}

原创粉丝点击