关于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个字节的空间,为什么不报错,程序还能正常运行???
谢谢大家,大家表达的应该都是一个意思,但是“小白范”同学说的比较易懂,就采纳他的吧! 展开
#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个字节的空间,为什么不报错,程序还能正常运行???
谢谢大家,大家表达的应该都是一个意思,但是“小白范”同学说的比较易懂,就采纳他的吧! 展开
4个回答
展开全部
要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用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()函数释放
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()函数释放
展开全部
感谢上帝,你的程序没给你的电脑带来什么问题。因为内存的空间有富余,才没有出问题。其实,你的程序已经读到了脏数据了。那些数据随时可以被你程序外的任何程序给覆盖掉。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
虽然你只申请了4个字节,可是,那4个字节后面还是有空间的,只不过是被你霸占了而已。
这样做导致的后果就是:内存越界!
你的程序小,虽然后面的空间被你改写了,但是看不出效果。
如果是在一个很大的工程里,你的定时炸弹一定会在某个时候“嘣”地一声。。。
这样做导致的后果就是:内存越界!
你的程序小,虽然后面的空间被你改写了,但是看不出效果。
如果是在一个很大的工程里,你的定时炸弹一定会在某个时候“嘣”地一声。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
#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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询