数据结构之malloc()函数动态内存分配复习

直接上代码分析 

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

int mian() {

	int a[5] = { 1,5,8,46,12 };

	int len;
	printf("请输入你要分配数组的长度: len=");
	scanf("%d", &len);

	int * pArr = (int *)malloc(sizeof(int) * len);   //为什么这里要使用强制类型转化?
	//malloc函数返回的是第一个元素地址,
	//这个第一个元素地址是没有意义的,因为double  int  char类型都一样返回第一个元素地址,
	//程序无法知道这个第一个元素地址是什么类型的和占几个字节,
	//所以需要强制类型转换告诉程序malloc函数返回的第一个元素地址的什么类型的

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

}

 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  就指向了后四位(一字节)
 

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个字节内存释放

原创文章 378 获赞 119 访问量 18万+

猜你喜欢

转载自blog.csdn.net/ywl470812087/article/details/105614186