动态内存分配

作者在 2011-09-07 14:58:26 发布以下内容
/*
时间:2011年9月7日14:26:51
备注:动态内存分配,需要使用malloc函数,malloc是memory(内存)+allocate(分配)的缩写
*/

# include <stdio.h>
# include <malloc.h>            //必须有,否则报错error C2065: 'malloc' : undeclared identifier

int main (void)
{
    int i= 5;        //静态分配,分配了4个字节

    int * p = (int*) malloc (4);
                                /*
                                1. 要使用malloc函数,必须添加malloc.h头文件
                                2. malloc函数只有一个形参,并且是整数类型(int或long int)
                                3. (int*) malloc (4)中的 形参 4,表示请求系统为本程序分配4个字节
                                4. malloc函数只能返回第一个字节的地址
                                5. (int*) malloc (4)中的(int*),是在做强制类型转换,将返回的 4个字节中的第一个字节地址 强制转化为 int变量的地址
                                    这样一来,虽然返回的只有一个字节地址,但系统会知道,分配的4个字节是同一个整形变量的地址
                                    所以 p 指向了4个字节,但p 里实际只保存了 4个字节中首个字节的地址,于是动态分配了4个字节
                                6. 上面这行代码到底分配了几个字节地址?答案,8个。动态分配了4个字节,但别忘了指针变量p还被静态分配了4个字节
                                
*/

    *p = 5;            //*p代表着一个整形变量,只不过*p这个整形变量的内存分配方式和i变量的不同。
    
    printf("i=%d,*p=%d\n",i,*p);        //输出结果 i=5,*p=5
    
    free(p);        //表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放,只能在p变量所在的函数运行终止时,由系统释放
    
    printf("i=%d,*p=%d\n",i,*p);        //释放后的输出结果 i=5,*p=-572662307
    
    return 0;
}
 
第2个例子
/*时间:2011年9月7日15:16:32*/
# include <stdio.h>
# include <malloc.h>

void f(int * q)        //形参q相当于,p的拷贝
{
    //q = 88;        //这样写不对,因为q是int *的,不能用整形常量给他赋值,会报错error C2440: '=' : cannot convert from 'const int' to 'int *'
    
//**q = 88;        //这样写也不对,**q表示以*q为地址的变量,但*q是整形变量,不是能做地址。会报错error C2100: illegal indirection
    *q = 88;        //q与p指向的地址相同,所以*q和*p代表的是相同的变量,在f函数里为*q赋值,main函数中的*q的值会变化
    
    
//free(q);        //不可以释放q指向的地址,因为这个地址就是main函数中p指向的地址,在这里释放会造成 输出发生错误 *p=-572662307
}

int main(void)
{
    int * p = (int *)malloc(sizeof(int));        //(sizeof(int) 是int型变量所占的字节数

    *p = 5;

    printf("*p=%d\n",*p);        //输出 *p = 5

    f(p);        //实参p 是int* 型的,所以函数形参也需定义为int *型

    printf("*p=%d\n",*p);        //输出*p = 88

    return 0;
}
郝斌视频笔记 | 阅读 1008 次
文章评论,共0条
游客请输入验证码
最新评论