c语言malloc函数

https://zhidao.baidu.com/question/442720454.html

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,这是基本的指针概念,为什么要强调这个?请继续看这过程,malloc对p做的操作仅仅是个赋值而已,除此之外malloc和p没有任何关系,都是独立的,真实的情况,不是说malloc给p分配空间,你这个说法是错误的,正确的说法是malloc分配料一段内存空间,通过p来使用这段内存而已。p仅仅是个使用者,并不是内存的所有者。
比如你的空间是10个字节,这个意思是说给你了10字节个空间的地址,你是的可以合法使用的内存空间,注意是合法使用的。
而p可以任意偏移的,可以便宜出分配的内存段,比如*(p+11),你可以打印这个值,有个随机数的,这意味着你可以p可以任意移动,但却是非法的,因为你偏离了给你分配的那个合法的空间。



是这样,你的确用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 );

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值