5、动态内存的分配(重难点)

传统数组的缺点:

1.数组的长度必须事先制定,且只能是常数,不能是变量

2.传统形式定义的数组,该数组的内存程序员无法手动释放,在一个函数运行期间,系统为该函数数组所分配的空间会一直存在,知道该函数运行结束,数组的空间才会被系统释放

3.数组的长度一旦被定义就不能再更改,数组的长度不能在函数运行的过程中动态的扩充或者缩小

4.A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕后,A函数中的数组将无法再被其他函数使用

为什么要需要动态分配内存?

动态数组很好的解决了传统数组的四个缺陷(传统数组也叫静态数组)

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    int i=5;
    int *p=(int *)malloc(4);
    /*
        1、要使用malloc函数必须添加malloc.h的头文件
        2、malloc函数只有一个形参,并且形参是整型
        3、4标识请求系统为本程序分配4个字节
        4、malloc函数只能返回第一个字节的地址
        5、p本身所占的内存是静态分配的,p所指向的内存是动态分配的
    */

    *p=5;

    free(p);    //表示把p所指向的内存给释放掉,但是p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数终止时由系统自动释放。

    return 0;
}

这里一开始有一个疑惑点,为什么此时*p可以直接赋值为5了呢?原因是这样的:

int * p = (int *)malloc(4);的解释是,在内在中分配连续4个字节的空间,并把第一个字节所在的地址强制为int *型指针值赋给int *型指针p。p已经有指向的地址,此地址已经有意义,只是这个地址内部的值还是随机的,比如我们认为这个地址为:p=0x1234,*p = 5。此时往0x1234这个地址内部放入一个int数,完全正确的操作。

但是int * q, 仅仅定义了q是一个int型的地址,但是q此时是随机值(windows下一般为0xcccc),也就是俗称的野指针,那么*p = 5; 的操作就是极度危险的,因为没人能预测你到底把这个5放到了系统的哪里,很可能会造成不可预测的破坏。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值