关于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;
}
- 关于malloc、malloc(0)及一个字符串翻转函数
- 关于 malloc(0)
- 关于malloc函数
- 关于malloc函数
- 关于malloc函数
- malloc函数及用法
- malloc函数及用法
- malloc函数及用法
- malloc函数及用法
- 一步一步写算法(关于malloc函数)
- malloc函数及new函数
- 关于malloc(0)
- malloc不是一个系统函数
- malloc()函数
- malloc()函数详解
- 转帖:关于malloc(0)的问题
- 关于malloc
- 关于 Malloc
- 输出100-1000以内的水仙花数
- 彪悍的人生不需要解释
- 宏中"#"和"##"的用法
- Google-Gson
- basic knowledge in python (1)
- 关于malloc、malloc(0)及一个字符串翻转函数
- Unity3D 输入中文
- JS 去空格
- MD5使用
- SSH远程登录问题:network error:no route to host
- 感悟。
- linux C 学习笔记 持续更新ing 进程
- 网络连接类型判断
- 自动生成一个ID号