关于c语言动态内存分配的问题

//我的机器环境是,win764位,vc++6.0#include<stdio.h>#include<malloc.h>intmain(void){int*p=(int*... //我的机器环境是,win7 64位,vc++6.0

#include <stdio.h>
#include <malloc.h>

int main(void)
{
int *p = (int*)(malloc(4));//动态定义一个数组,分配4个字节的空间
int i;
for(i = 0; i<3; i++)
scanf(" %d",&p[i]);//给该数组赋值

for(i = 0; i<3; i++)
printf("%d\n",p[i]);//输出数组

return 0;

}
我想问下,我只给p分配了4字节,为什么他能存储3个int数组元素(我这里写的是3,再多些也能存),1个int变量不就占4个字节吗?3个就是12个字节,但我只分配了4个字节的空间,为什么不报错,程序还能正常运行???
谢谢大家,大家表达的应该都是一个意思,但是“小白范”同学说的比较易懂,就采纳他的吧!
展开
 我来答
那郎荣碧白
2020-03-24 · TA获得超过4109个赞
知道大有可为答主
回答量:3095
采纳率:32%
帮助的人:200万
展开全部
要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
1.malloc函数
  函数原型为void
*malloc(unsigned
int
size);在内存的动态存储区中分配一块长度为"size"
字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如:
pc=(char
*)
malloc
(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,
把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
2.calloc
函数
函数原型为void
*calloc(unsigned
int
num,
unsigned
int
size)
  按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为
num*size。函数返回该存储区的起始地址。calloc函数与malloc
函数的区别仅在于一次可以分配n块区域。例如:
ps=(struct
stu*)
calloc(2,sizeof
(struct
stu));
其中的sizeof(struct
stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
3.
realloc函数:
 
函数原型为void
*realloc(void
*ptr,
unsigned
int
size)
重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地
址(该地址可能与以前的地址不同)。例如p1=(float
*)realloc(p1,16);将原先开辟的8个字节调整为16个字节。
**动态申请的内存空间要进行手动用free()函数释放
缘明思
2015-05-15 · TA获得超过543个赞
知道小有建树答主
回答量:795
采纳率:88%
帮助的人:349万
展开全部
感谢上帝,你的程序没给你的电脑带来什么问题。因为内存的空间有富余,才没有出问题。其实,你的程序已经读到了脏数据了。那些数据随时可以被你程序外的任何程序给覆盖掉。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小白范
推荐于2016-04-10 · TA获得超过358个赞
知道小有建树答主
回答量:309
采纳率:50%
帮助的人:284万
展开全部
虽然你只申请了4个字节,可是,那4个字节后面还是有空间的,只不过是被你霸占了而已。
这样做导致的后果就是:内存越界!
你的程序小,虽然后面的空间被你改写了,但是看不出效果。
如果是在一个很大的工程里,你的定时炸弹一定会在某个时候“嘣”地一声。。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仉紫玉c8
2015-05-15 · 超过30用户采纳过TA的回答
知道答主
回答量:233
采纳率:0%
帮助的人:64.2万
展开全部
#include <stdio.h>
#include <malloc.h>

int main(void)
{
int *p = (int*)(malloc(4));//动态定义一个数组,分配4个字节的空间
int i;
for(i = 0; i<3; i++)
printf("%d\n",p[i]);//先输出这三个位置上的内容输出数组
for(i = 0; i<3; i++)
scanf(" %d",&p[i]);//给该数组赋值

for(i = 0; i<3; i++)
printf("%d\n",p[i]);//输出数组

return 0;

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

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式