malloc()动态分配内存概述

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

void main()
{
    int a[5] = {4,10,2,8,6};

    int len;
    printf("请输入你需要分配的数组的长度:len=");
    scanf("%d",&len);
    int * pArr = (int *)malloc(sizeof(int)*len);    //malloc 是系统函数
    *pArr = 4;    //类似于 a[0] = 4;
    pArr[1] = 10;    //类似于  a[1] = 10;

    return 0;
}

        int* pArr = (int*)malloc(sizeof(int)*len);         如果len占5个字节的话,那么 malloc(sizeof(int)*len)=20  个字节, 20表示的是这个malloc函数请求操作系统要为我们的程序分配20个字节的空间,就是提供20个字节的空间来为我们程序进行读写.

         malloc函数只能返回第一个字节的地址,这个是系统规定的,第一个字节的地址没有实际含义。因为不能根据第一个字节地址来确定这个变量占了几个字节。因为整形变量占四个字节,它也是以第一个字节地址来表示的,如果这个变量是double类型的话,它也是以第一个字节地址来表示的。无论这个变量占几个字节它都是以第一个字节来表示的,所以malloc返回的第一个字节地址是没有实际意义的地址(干地址)。所以我们需要在  malloc(sizeof(int)*len)  的前面加一个强制类型转换  (int*)malloc(sizeof(int)*len)  来告诉我们的编译器,我们返回的第一个字节地址到底是整型的地址,还是其他类型的地址。所以强制转换成 int * 的话,那么我们的  pArr+1  的话那么它将会指向后面的一个 int * 的位数,会指向后四位,如果强制类型是  double *  的话,  pArr + 1   将会指向后八位的地址。

         所以我们的  pArr  就等价与   a(数组,数组名表示首地址) , 因为a是指向了第一个元素,第一个元素就占了四个字节。   malloc(sizeof(int)*len)  这个分配了20个字节,malloc返回第一个整型的地址,pArr也指向前四个字节,pArr表示的是整型的地址。  那么  pArr + 1  就是指向了后四位了。

           那么  *pArr = 4;     //类似于   a[0] = 4;

                      pArr[1] = 10;   //类似于a[1] = 10;

                      然后就导致了   pArr  表示前四位(第一个字节)   

                                               pArr + 1  就指向了后四位(一字节)

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

void main()
{
    int a[5] = {4,10,2,8,6};

    int len;
    printf("请输入你需要分配的数组的长度:len=");
    scanf("%d",&len);
    int * pArr = (int *)malloc(sizeof(int)*len);    //malloc 是系统函数
    //*pArr = 4;    //类似于 a[0] = 4;
    //pArr[1] = 10;    //类似于  a[1] = 10;

    //printf("%d %d\n", *pArr,pArr[1]);

    //我们可以把pArr当作一个普通数组来使用
    for(int i=0;i<len;++i)
        scanf("%d",&pArr[i]);

    for(i=0;i<len;++i)
    printf("%d\n"*(pArr+i));

    free(pArr);    //把pArr所代表的动态分配的20个字节内存释放

    return 0;
}

           free(pArr);    //把pArr所代表的动态分配的20个字节内存释放

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/81158368
今日推荐