c语言malloc函数返回值,malloc函数返回值

1 , malloc函数返回值强制转换本来就不是必须的,malloc()返回的是void *类型的,会根据不同的指针变量而自动转换成所需要的类型,只不过在有些编译系统中,不加类型转换会收到WRONG而已 。sizeof(int *)返回int *类型的长度(也就是整型指针的长度)int **d表示d是一个指针的指针,在这里是用来动态分配二维数组的 。malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。C,C++规定,void* 类型可以强制转换为任何其它类型的指针 。原型:extern void *malloc(unsigned int num_bytes);头文件:#include 功能:分配长度为num_bytes字节的内存块返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定) , 否则返回空指针NULL 。当内存不再使用时,应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐,使其可以用于任何数据对象 。
2,malloc函数你的概念混淆了变量声明后不会分配内存空间你想说的是定义变量吧 。但是这种空间是分配在栈里面的而malloc申请的是堆里面的通常说的堆栈是两个东西 。以下是baidu到的对于malloc的说明原型:extern void *malloc(unsigned int num_bytes);用法:#include <malloc.h>或#include<stdlib.h>功能:用于向内存申请空间,分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针null 。当内存不再使用时 , 应使用free()函数将内存块释放 。以下是本人追加的讲解因为malloc的返回值是void *所以动态开辟后的内存都需要强制转换类型例如开辟了10个int型内存空间格式就是int *p;p=(int *)malloc(10*sizeof(int))通用格式 指针=(数据指针类型)malloc(开辟个数*sizeof(数据类型))
3,malloc函数的返回值怎么确定啊malloc函数返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定) , 否则返回空指针NULL 。当内存不再使用时,应使用free()函数将内存块释放 。函数返回的指针一定要适当对齐 , 使其可以用于任何数据对象 。程序编码:p=(int* )mallco(sizeof(int));if(p==NULL)perror("malloc error");exit(1);}*p=n;return *p;原型:extern void *malloc(unsigned int num_bytes);头文件:#include <stdlib.h>功能:分配长度为num_bytes字节的内存块说明:关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定 , 该函数返回为void型指针,因此必要时要进行类型转换 。名称解释:malloc的全称是memory allocation,中文叫动态内存分配 , 当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存 。函数声明:全名:void *malloc(size_t size);备注:void* 表示未确定类型的指针 , void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int)p = ...malloc(...)....;if(p == NULL)...}else...}做一个if判断就可以if(p==NULL)perror("malloc");elseprintf("malloc is ok");malloc()函数返回值类型是void型指针,是你申请的内存空间首地址 , 个人理解之所以是void*是因为你申请的空间存储数值类型不同,例如int *p=(int *)malloc(sizeof(int)*100);//可存储100个整形变量,100*4bytes//可以是 结构体:typedef struct test int a; int b; char c[4];}test;test *p=(test *)malloc(sizeof(test)*4);//大小为test p[4]数组相同【c语言malloc函数返回值,malloc函数返回值】
4,C语言 mallocvoid *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。C,C++规定,void* 类型可以强制转换为任何其它类型的指针 。从函数声明上可以看出 。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小 。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为 int* 类型(整数型指针) , 分配大小为 sizeof(int) * 100; 而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针 。int* p; p = (int *) malloc (sizeof(int)); 第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译 , 报错:“不能将 void* 赋值给 int * 类型变量” 。所以必须通过 (int *) 来将强制转换 。第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小 。如果你写成: int* p = (int *) malloc (1); 代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空 。malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小 。比如想分配100个int类型的空间: int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间 。另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的 。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致 。对其做一个特例补充 char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts("Got a null pointer"); else puts("Got a valid pointer"); 此时得到的是Got a valid pointer 。把0赋给malloc能得到一个合法的指针 。5,c语言malloc函数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 );首先你要明确是指针的概念:很明确的定义就是存放地址的变量 。请注意这个定义,没有任何其他的约束 。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或者...)?

    推荐阅读