c语言中malloc函数,关于c语言malloc函数高手请进

1,关于c语言malloc函数高手请进malloc申请的空间是在堆中,返回的是指向堆的一个指针而已 。而函数调用过程中的变量、现场保护等都在栈中(这里并不是说所有变量本身在栈中,value type值类型的变量本身是在栈中的,而reference type引用类型的变量在栈中有一个指向相应存放变量内容本身的堆空间的指针 , 当这个指针变为null引用时,相应的堆中的空间就可以被内存管理机制回收了,但是malloc返回的是在堆中的一个有效的非null引用) 。楼主的问题其实和malloc内部实现并没有太多的关系 , 而是和内存空间的使用形式有关 。
2,关于c语言的内存分配中的malloc函数是1个字节 。因此,不建议直接写立即数 。最好是写成p=(char *)malloc(sizeof(char));p=(int *)malloc(sizeof(int));当然,如果你确定要用n字节的内存,那么写上n也不错 。malloc是按照你指定的大小需求,分配内存给你,并不会以什么特殊的字符结尾,所以使用的时候要特别注意不要越界了,建议你malloc成功后,将获得的内存清零,方便以后使用 。都是字节,对,一个字节1,默认就是一个字节char的长度 。。建议使用方法是类型* a = (类型*)malloc(sizeof(类型)*大小);
3,c语言 malloc函数是什么意义分配内存空间 , 一般用在链表结构中开辟内存 。比如int *p;p=(int *)malloc (100*sizeof(int));它开辟100个int单元,即400字节 。然后p指向第一个元素 。之后也可以用p[0],p[1]我理解的,知malloc用于申请动态空间 , 比如数组先道输入数组大小n,再用下列语句分配空内间int *arr = (int *) malloc ( sizeof(int) * n );更多查看百度百科关于malloc函数容http://baike.baidu.com/view/1213621.htm现在机器的系统一般都是32位或者64位,所以系统会自动回收资源,如果你的程序在16位的系统下运行你不调用free就不会释放内存 。我们要养成好的编程习惯,所以尽量去调用free 。【c语言中malloc函数,关于c语言malloc函数高手请进】
4 , C语言中malloc函数的使用方法(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))如果成功,则返回该空间首地址 , 该空间没有初始化,如果失败,则返回0malloc函数的参数是你需要在堆上分配的内存的大小,单位是字节 。函数返回一个void*型的变量,就是分配的内存的起始地址,需要转换为你所需要的类型的指针 。如果分配失败,会返回null,这要在分配结束后先检查 。最后,使用完毕内存别忘了free 。例:分配10个整形变量的内存空间 。int * start;if ( (start=(int *)molloc(sizeof(int)*10)) == null ){printf("momery is not enough!\a");exit(1);}.../* 使用你申请的内存 */free(start);C语言中malloc是动态内存分配函数 。函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数 。返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL 。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)功能:分配长度为num_bytes字节的内存块注意:当内存不再使用时,应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐,使其可以用于任何数据对象 。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定 , 该函数返回为void型指针,因此必要时要进行类型转换 。实例:#include"stdio.h"#include"malloc.h"//malloc()函数被包含在malloc.h里面int main(void)char*a=NULL;//声明一个指向a的char*类型的指针a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给aif(!a)//如果malloc失败,可以得到一些logperror("malloc");return-1;}sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址printf("%s\n",a);//输出用户输入的数据free(a);//释放掉使用的内存地址return0;//例2有无内存泄露?}void *malloc( size_t size ); 该函数包含于stdlib.h和malloc.h中 , 分配一块内存区域,若成功则返回指向该区域的指针,否则返回NULL 。下面的例子中分配了一块内存区域 , 然后把它释放:char * x;x = malloc(_MAX_PATH);free(x);返回值类型为 void *,调用格式为:malloc(size),size的类型为unsigned int。malloc函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址 。若没有足够的内存单元供分配,函数返回空(NULL)通过调用malloc函数所分配的动态存储单元中没有确定的初值,这个存储单元也没有名字,吸能靠指针来引用它 。例:int *pi;float *pf;pi=(int *)malloc(2); pf=(float *)malloc(4);因为malloc函数的返回的地址为void *,在调用函数时,必须延用强制类型转换将其转换为所需要的类型 。括号中的*号代表返回的是指针类型的5,c语言malloc函数首先你要明确是指针的概念:很明确的定义就是存放地址的变量 。请注意这个定义 , 没有任何其他的约束 。malloc分配空间 , 是指系统按照的你程序在内存堆栈中分配一段内存给你,而该内存段的首地址赋值给你的p,这是基本的指针概念,为什么要强调这个?请继续看这过程 , malloc对p做的操作仅仅是个赋值而已,除此之外malloc和p没有任何关系,都是独立的 , 真实的情况 , 不是说malloc给p分配空间,你这个说法是错误的,正确的说法是malloc分配料一段内存空间,通过p来使用这段内存而已 。p仅仅是个使用者,并不是内存的所有者 。比如你的空间是10个字节 , 这个意思是说给你了10字节个空间的地址 , 你是的可以合法使用的内存空间,注意是合法使用的 。而p可以任意偏移的 , 可以便宜出分配的内存段 , 比如*(p+11),你可以打印这个值 , 有个随机数的 , 这意味着你可以p可以任意移动,但却是非法的 , 因为你偏离了给你分配的那个合法的空间 。1、malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。C,C++规定 , void* 类型可以强制转换为任何其它类型的指针 。2、定义原型:extern void *malloc(unsigned int num_bytes);头文件:#include <stdlib.h>功能:分配长度为num_bytes字节的内存块返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL 。当内存不再使用时,应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐,使其可以用于任何数据对象 。说明:关于该函数的原型 , 在以前malloc返回的是char型指针 , 新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换 。名称解释:malloc的全称是memory allocation,中文叫动态内存分配 , 当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存 。相关函数:calloc、realloc、free、_alloca3、函数全名:void *malloc(size_t size);备注:void* 表示未确定类型的指针,void *可以指向任何类型的数据 , 更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)?int * p = (int *)malloc(10);//整形数组p分配10个元素;p[0] = 0;p[1]= 1;p[2]=2;printf("%d%d%d\n", sizeof(p[0]),sizeof(p[1]),sizeof(p[2]));//为p数组分配三个元素输出为444,这里计算的单个元素的字节数,Int类型肯定是4 。malloc只是动态分配内存存储空间 。void *malloc(long nbytes):该函数分配了nbytes个字节,并返回了指向这块内存的指针 。如果分配失败,则返回一个空指针(null)例如:char *ptr = null;ptr = (char *)malloc(100 * sizeof(char)); 就是这样!当然,具体情况要具体分析以及具体解决 。比如说 , 你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了因为p[0] p[1] p[2]都是int类型,你打印printf("%d%d%d\n", sizeof(p[0]),sizeof(p[1]),sizeof(p[2]));输出当然是4 4 4 , 与你用malloc分配多少没有关系但是你这样分配内存有问题,应该int * p = (int *)malloc(3*sizeof(int));是这样,你的确用malloc分配了10个字节的空间,但你后来p[2]赋值时因为Int占四个四节 , 于是p[2]的首地址是你分配的10个字节的第九个字节的地址,于是你往里面写入数据,以为是Int类型 , 于是会超出你所分配的10个字节,多出两个字节,而这两个字节并没有被申请,而是写入了“邻居”的地址,但是你这样输出printf("%d%d%d\n", sizeof(p[0]),sizeof(p[1]),sizeof(p[2]));sizeof(p[2])其实相当于sizeof(int),于是输出是4 , 所以建议你要正确的使用malloc如下int* p = (int *) malloc ( sizeof(int) * 10 );