c语言malloc函数

int*p=(int*)malloc(10);//我如果为整形数组p分配10个字节;p[0]=0;p[1]=1;p[2]=2;printf("%d%d%d\n",size... 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数组分配三个元素输出为4 4 4,那不是有12个字节了吗?
//请帮我解释一下,谢谢!!!!!!!!
malloc函数为p分配空间有什么用;p也不受malloc限制吗;
展开
 我来答
大衍之49
推荐于2017-10-04 · TA获得超过1049个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:1072万
展开全部
首先你要明确是指针的概念:很明确的定义就是存放地址的变量。请注意这个定义,没有任何其他的约束。
malloc分配空间,是指系统按照的你程序在内存堆栈中分配一段内存给你,而该内存段的首地址赋值给你的p,这是基本的指针概念,为什么要强调这个?请继续看这过程,malloc对p做的操作仅仅是个赋值而已,除此之外malloc和p没有任何关系,都是独立的,真实的情况,不是说malloc给p分配空间,你这个说法是错误的,正确的说法是malloc分配料一段内存空间,通过p来使用这段内存而已。p仅仅是个使用者,并不是内存的所有者。
比如你的空间是10个字节,这个意思是说给你了10字节个空间的地址,你是的可以合法使用的内存空间,注意是合法使用的。
而p可以任意偏移的,可以便宜出分配的内存段,比如*(p+11),你可以打印这个值,有个随机数的,这意味着你可以p可以任意移动,但却是非法的,因为你偏离了给你分配的那个合法的空间。
mike
推荐于2017-10-11 · 知道合伙人教育行家
mike
知道合伙人教育行家
采纳数:15109 获赞数:42259
担任多年高三教学工作。

向TA提问 私信TA
展开全部
  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、_alloca
  3、函数全名:void *malloc(size_t size);
  备注:void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱上夜色深沉
2012-06-25 · TA获得超过459个赞
知道小有建树答主
回答量:377
采纳率:100%
帮助的人:345万
展开全部
是这样,你的确用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分配空间有什么用;p也不受malloc限制啊;
请解释一下,这个问题困扰我很久了;
谢谢
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
icepointfirst
2012-06-25 · TA获得超过303个赞
知道小有建树答主
回答量:214
采纳率:0%
帮助的人:226万
展开全部
因为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));
更多追问追答
追问
为p分配3个元素那p数组不是占12个字节吗
追答
是呀,sizeof(int) = 4,   3*4=12, 这样才能正确分配包含3个int的数组
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
属于你的我知道
2012-07-15 · TA获得超过188个赞
知道答主
回答量:65
采纳率:0%
帮助的人:18.9万
展开全部
molloc是动态分配内存用的,局部变量存放在栈区,申请多少自己可定,不是固定死不变,而且用完之后可以用free释放内存空间,可以有效的使用系统内存,不会造成浪费!

当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

参考资料: http://baike.baidu.com/view/1213621.htm

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式