不用分配内存,会有没有不利之处?
看完动态内存管理,里面用到malloc(),calloc()来动态管理内存.下面用个例子来说一下我的问题:
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));/*如果是不用这里的内存分配,直接写下面的一行,(1)有错吗?(2)如果这里不用动态内存管理会有什么不利的地方吗?*/
ps-> num=102;
ps-> name= "Zhang ping ";
ps-> sex= 'M ';
ps-> score=62.5;
就是上面的两个问题,静候佳音.
[解决办法]
(2)如果这里不用动态内存管理会有什么不利的地方吗?
不使用动态分配,
那么只有预分配,
就是直接定义变量,
但是这样有时候,你无法预定义。
比如一个数组,不知道长度,
动态分配可以解决,
预分配就无从下手,只能分配一个足够大的数组空间,这样很浪费 ~
[解决办法]
(1)错,不分配内存哪来的空间
(2)不动态分配内存只能预分配,在不知道将来用多少的情况下会导致空间不足或空间浪费
[解决办法]
(1)当未分配内存时,ps是一个随机值,直接向这个地址写入内容的话会对已有的内存空间造成破坏。因此一定要先分配一块有足够大小的空闲的内存空间,再把地址赋给ps。
(2)动态内存管理的好处就是它对程序员来说是可控的,想要怎么分配自己做决定。因为很多时候,你不知道要分配多少内存,这样就不好在初始化的时候定义下来并由系统来分配空间,或者一开始分配的空间再后面不够用了,需要扩大,这时用动态内存管理是很方便的。
[解决办法]
1)有错吗?
是错的,因为不分配内存这时的ps是指向的说不定什么地方,不是你能控制的,所以你在这里面对它的成员进行赋值,必然占用了非法的内存,出错
(2)如果这里不用动态内存管理会有什么不利的地方吗?*/
不用动态就要定义一个对象了.
struct stu ss;
ss.num=102;
ss.name= "Zhang ping ";
ss.sex= 'M ';
ss.score=62.5;
这样这个对象ss也有固定的合法内存,可以赋值的
[解决办法]
举个例子:
老板拿一把钥匙(指针)跟你,让你把刚来那车货(数据)下来放好.但仓房有几十亿个(内存),钥匙上的指示却是一个不存在的编号(负值).这时你把货下来放哪里?
原来钥匙能开大多数的仓库,但有些仓库是放起炸药的,你冒冒失失的把其他货物放进去,炸你个底朝天.有些仓库放的是鸡蛋,再放东西,鸡蛋就碎了.所以你不能自做主张随便给钥匙贴个标签去开门.
所以只好给老板打电话(malloc),老板查了他的仓库使用情况表,知道可以把货物放哪儿,于是告诉你一个仓库号码(malloc的返回值),这时你就可以用你的钥匙去开门了...