精华内容
下载资源
问答
  • java实现内存动态分配

    2016-07-09 08:36:20
    内存动态分配\java实现
  • C语言动态分配二维数组,对数组动态分配进行详细描述
  • 动态分配和静态分配

    千次阅读 2019-06-28 21:06:11
    所谓动态内存分配就是指在程序执行的过程中动态分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是...

    所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

    例如我们定义一个float型数组:float score[100]; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?

    在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。

    这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

    我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:

    1、不需要预先分配存储空间;

    2、分配的空间可以根据程序的需要扩大或缩小。

         说白了,内存的静态分配和动态分配的区别主要是两个:

           一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。

          二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数alloca()进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。    

           对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

            一般,用static修饰的变量,全局变量位于静态数据区。函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。

    展开全文
  • C语言中动态分配数组

    万次阅读 多人点赞 2018-06-21 12:57:42
    很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些...

    很多人在编写C语言代码的时候很少使用动态数组,不管什么情况下通通使用静态数组的方法来解决,在当初学习C语言的时候我就是一个典型的例子,但是现在发现这是一个相当不好的习惯,甚至可能导致编写的程序出现一些致命的错误。尤其对于搞嵌入式的人来所,嵌入式系统的内存是宝贵的,内存是否高效率的使用往往意味着嵌入式设备是否高质量和高性能,所以高效的使用内存对我们来说是很重要的。那么我们在自己编写C语言代码的时候就应该学会使用动态数组,这也就是我这篇博客要给大家讲的,我尽我所能的用一些简单的代码来讲解动态数组,希望我所讲的对你有所帮助。

    那么我们首先来看看什么是动态数组,动态数组是相对于静态数组而言,从“动”字我们也可以看出它的灵活性,静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。所以相对于静态数组的来说我们对于使用动态数组有很大的自由度。

    在创建动态数组的过程中我们要遵循一个原则,那就是在创建的时候从外层往里层,逐层创建;而释放的时候从里层往外层,逐层释放。这个话你读了可能理解并不深刻,不过不要急,接下来我们看看两段代码。

    一维动态数组的创建:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int n1,i;
    int *array;
    printf("请输入所要创建的一维动态数组的长度:");
    scanf("%d",&n1);
    array=(int*)calloc(n1,sizeof(int));
    for(i=0;i<n1;i++)
    {
     printf("%d\t",array[i]);
    }
    printf("\n");
    for(i=0;i<n1;i++)
    {
     array[i]=i+1;
     printf("%d\t",array[i]);
    }
     free(array);//释放第一维指针 
    return 0;
    }

    运行结果为:

     

    二维数组的创建:

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    
    int main(){
    	int num1,num2;
    	cout<<"请输入动态二维数组的第一个维度:";
    	cin>>num1;
    	cout<<"请输入动态二维数组的第二个维度:";
    	cin>>num2;
    	int **array = (int **)calloc(num1,sizeof(int));
    	for(int i=0;i<num1;i++) {
    		array[i] = (int*)calloc(num2,sizeof(int));
    	}
    	for(int i=0;i<num1;i++){
    		for(int j=0;j<num2;j++){
    			array[i][j] =i*num2+j+1;
    			printf("%d\t",array[i][j]);
    		}
    		cout<<endl;
    	}
    	for(int i=0;i<num1;i++)	free(array[i]);
    	free(array);
    	return 0;
    }

    运行结果为:

     请输入所要创建的动态数组的第一维长度:3
    请输入所要创建的动态数组的第二维长度:3
    1       2       3
    4       5       6
    7       8       9
    Press any key to continue

    有了上面的代码我们再来说动态数组的建立就简单了,以二维为例,先说创建,还记得我们上面说的创建的原则嘛:从外层往里层,逐层创建。

    array=(int**)malloc(n1*sizeof(int*)); //第一维

    以上是我们创建二维动态数组的最外层,创建好了最外层那么我们接下来就是要创建次外层了。这里使用了二级指针。

    array[i]=(int*)malloc(n2* sizeof(int));//第二维

    在创建次外层的过程中我们使用了一个for语句,千万别忘了使用for循环语句,这是绝大多数人的一个易错点。

    创建好了接下来我们该讲到释放了,而释放的时候从里层往外层,逐层释放。刚刚与我们上面的创建相反,在以上代码中我们首先使用了下面一个for循环来释放里层。

    for(i=0;i<n1;i++) 

    free(array[i]);//释放第二维指针 
    }

    在通过以下语句来释放外层。
    free(array);//释放第一维指针

    如果出现多维的情况怎么做呢,我们接下来再来看看一个三维动态数组的创建和释放,以加深下读者的印象。代码如下:

    #include <stdlib.h> 
    #include <stdio.h> 
    int main() 
    { 
    int n1,n2,n3; 
    int ***array; 
    int i,j,k; 
    printf("请输入所要创建的动态数组的第一维长度:");
    scanf("%d",&n1); 
    printf("请输入所要创建的动态数组的第二维长度:");
    scanf("%d",&n2); 
    printf("请输入所要创建的动态数组的第三维长度:");
    scanf("%d",&n3); 
    array=(int***)malloc(n1*sizeof(int**));//第一维 
    for(i=0; i<n1; i++) 
    { 
    array[i]=(int**)malloc(n2*sizeof(int*)); //第二维 
    for(j=0;j<n2;j++) 
    { 
    array[i][j]=(int*)malloc(n3*sizeof(int)); //第三维 
    } 
    } 
    for(i=0;i<n1;i++)
    {
    for(j=0;j<n2;j++)
    {
    for(k=0;k<n3;k++) 
    { 
    array[i][j][k]=i+j+k+1; 
    printf("%d\t",array[i][j][k]); 
    } 
    printf("\n");
    }
    printf("\n");
    }
    for(i=0;i<n1;i++) 
    { 
    for(j=0;j<n2;j++) 
    { 
    free(array[i][j]);//释放第三维指针 
    } 
    } 
    for(i=0;i<n1;i++) 
    { 
    free(array[i]);//释放第二维指针 
    } 
    free(array);//释放第一维指针 
    return 0; 
    }

    运行结果为:

    请输入所要创建的动态数组的第一维长度:3
    请输入所要创建的动态数组的第二维长度:3
    请输入所要创建的动态数组的第三维长度:3
    1       2       3
    2       3       4
    3       4       5

    2       3       4
    3       4       5
    4       5       6

    3       4       5
    4       5       6
    5       6       7

    Press any key to continue

    看了以上三维动态数组的创建和释放代码以后,我想读者这个时候已经可以自己编写任意维的动态数组了。但是细心的读者可能发现了一个问题,那就是我们所讲的动态数组都是一次性创建好的,如果接下来在使用的过程中我们使用的数组需要扩展或者删减一些不再使用元素该怎么办呢?!接下来我们先看一段关于动态数组扩展的代码,在此以一维动态数组的扩展为例,其它的以此类推。

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int*n,*p;
    int i,n1,n2;
    printf("请输入所要创建的动态数组的长度:");
    scanf("%d",&n1); 
    n=(int*)calloc(n1,sizeof(int));
    printf("请输入所要扩展的动态数组的长度:");
    scanf("%d",&n2); 
    p=(int*)realloc(n,(n2)*sizeof(int));//动态扩充数组
    for(i=0;i<n2;i++)
    {
    p[i]=i+1;
    if(i%5==0)
    printf("\n");
    printf("%d\t",p[i]);
    }
    free(p);
    return 0;
    }

    运行结果如下:

    请输入所要创建的动态数组的长度:6
    请输入所要扩展的动态数组的长度:25

    1       2       3       4       5
    6       7       8       9       10
    11      12      13      14      15
    16      17      18      19      20
    21      22      23      24      25      Press any key to continue

     

    接下来如何缩小动态数组。

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int*n,*p;
    int i,n1,n2;
    printf("请输入所要创建的动态数组的长度:");
    scanf("%d",&n1); 
    n=(int*)calloc(n1,sizeof(int));
    for(i=0;i<n1;i++)
    {
    n[i]=i+1;
    if(i%5==0)
    printf("\n");
    printf("%d\t",n[i]);
    }
    printf("\n请输入所要缩小的动态数组的长度:");
    scanf("%d",&n2); 
    p=(int*)realloc(n,(n2)*sizeof(int));
    for(i=0;i<n2;i++)
    {
    if(i%5==0)
    printf("\n");
    printf("%d\t",p[i]);
    }
    printf("\n");
    free(p);
    return 0;
    }

    运行结果为:

    请输入所要创建的动态数组的长度:25

    1       2       3       4       5
    6       7       8       9       10
    11      12      13      14      15
    16      17      18      19      20
    21      22      23      24      25
    请输入所要缩小的动态数组的长度:15

    1       2       3       4       5
    6       7       8       9       10
    11      12      13      14      15
    Press any key to continue

    在这里值得注意的一点就是在缩减动态数组的时候,它是删除了后面的元素,而前面的元素保持不变。在使用realloc()函数的时候要由其注意它的使用规则。

     

    讲到这儿就到了该说结束的时候了,由于本人水平有限,博客中的不妥或错误之处在所难免,殷切希望读者批评指正。同时也欢迎读者共同探讨相关的内容,如果乐意交流的话请留下你宝贵的意见。

    展开全文
  • 数组动态分配与静态分配的区别

    千次阅读 2020-04-23 21:02:43
    所谓动态内存分配就是指在程序执行的过程中动态分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是...

    所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

    例如我们定义一个float型数组:float score[100]; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?

    在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。

    这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

    我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:

      1、不需要预先分配存储空间;
    
    
    
      2、分配的空间可以根据程序的需要扩大或缩小。
    
    
    
      内存的静态分配和动态分配的区别主要是两个:
    
    
      一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。
    
      二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数alloca()进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。    
      对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
      一般,用static修饰的变量,全局变量位于静态数据区。函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。
    

    1、一维数组动态分配(1)

    #include

    //一维数组
    void oneDimensionalArray()
    {
    //定义一个长度为10的数组
    int* array = new int[10];
    //赋值
    for(int i = 0; i < 10; i++)
    {
    array[i] = i*2;
    }
    //打印
    for(int i = 0; i < 10; i++)
    {
    std::cout << i << " : " << array[i] << std::endl;
    }
    //释放内存
    delete[] array;
    }
    注意:

    int *p=new int[len];这一句,你不能这样做:int p[len];

    C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行:

    int p[]=new int[len];

    编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int *p=new int[len];

    注意要注销指针p,使程序释放用new开辟的内存空间。

    一维数组动态分配(2)

    假设动态构造一个Int型数组:
    1 int *p = (int *)malloc(int len);
    2 //还可以写作:
    3 int *p = (int *)malloc(sizeof(int)*len);
    4 int *p = (int *)malloc(sizeof(len));
    5 数据类型 *p = (数据类型 *)malloc(sizeof(数据类型)*长度);
    1.malloc只有一个int型的形参,表示要求系统分配的字节数
      2.malloc函数的功能是请求系统分配len个字节的内存空间,如果请求成功,则返回第一个字节的地址,如果请求失败,则返回NULL。

    3.malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无任何实际意义的第一个字节的地址(俗称干地址)转化成一个有实际意义的地址,nalloc函数前面必须加(数据类型 *),表示把这个无实际意义的第一个地址转化为相应类型的地址。如:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int n1,i;
    int array;
    printf(“请输入所要创建的一维动态数组的长度:”);
    scanf("%d",&n1);
    array=(int
    )calloc(n1,sizeof(int));
    for(i=0;i<n1;i++)
    {
    printf("%d\t",array[i]);
    }
    printf("\n");
    for(i=0;i<n1;i++)
    {
    array[i]=i+1;
    printf("%d\t",array[i]);
    }
    free(array);//释放第一维指针
    return 0;
    }

    2、二维数组动态创建

    在创建动态数组的过程中我们要遵循一个原则,那就是在创建的时候从外层往里层,逐层创建;而释放的时候从里层往外层,逐层释放。

    array=(int**)malloc(n1sizeof(int)); //第一维

    以上是我们创建二维动态数组的最外层,创建好了最外层那么我们接下来就是要创建次外层了。这里使用了二级指针。

    array[i]=(int*)malloc(n2* sizeof(int));//第二维

    在创建次外层的过程中我们使用了一个for语句,千万别忘了使用for循环语句,这是绝大多数人的一个易错点。

    创建好了接下来我们该讲到释放了,而释放的时候从里层往外层,逐层释放。刚刚与我们上面的创建相反,在以上代码中我们首先使用了下面一个for循环来释放里层。

    for(i=0;i<n1;i++)
    {
    free(array[i]);//释放第二维指针
    }
    在通过以下语句来释放外层。

    free(array);//释放第一维指针

    #include
    #include <stdlib.h>
    using namespace std;

    int main(){
    int num1,num2;
    cout<<“请输入动态二维数组的第一个维度:”;
    cin>>num1;
    cout<<“请输入动态二维数组的第二个维度:”;
    cin>>num2;
    int **array = (int *)calloc(num1,sizeof(int));
    for(int i=0;i<num1;i++) {
    array[i] = (int
    )calloc(num2,sizeof(int));
    }
    for(int i=0;i<num1;i++){
    for(int j=0;j<num2;j++){
    array[i][j] =i*num2+j+1;
    printf("%d\t",array[i][j]);
    }
    cout<<endl;
    }
    for(int i=0;i<num1;i++) free(array[i]);
    free(array);
    return 0;
    }
    3、三维数组动态创建

    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
    int n1,n2,n3;
    int array;
    int i,j,k;
    printf(“请输入所要创建的动态数组的第一维长度:”);
    scanf("%d",&n1);
    printf(“请输入所要创建的动态数组的第二维长度:”);
    scanf("%d",&n2);
    printf(“请输入所要创建的动态数组的第三维长度:”);
    scanf("%d",&n3);
    array=(int
    )malloc(n1sizeof(int**));//第一维
    for(i=0; i<n1; i++)
    {
    array[i]=(int**)malloc(n2
    sizeof(int*)); //第二维
    for(j=0;j<n2;j++)
    {
    array[i][j]=(int*)malloc(n3*sizeof(int)); //第三维
    }
    }
    for(i=0;i<n1;i++)
    {
    for(j=0;j<n2;j++)
    {
    for(k=0;k<n3;k++)
    {
    array[i][j][k]=i+j+k+1;
    printf("%d\t",array[i][j][k]);
    }
    printf("\n");
    }
    printf("\n");
    }
    for(i=0;i<n1;i++)
    {
    for(j=0;j<n2;j++)
    {
    free(array[i][j]);//释放第三维指针
    }
    }
    for(i=0;i<n1;i++)
    {
    free(array[i]);//释放第二维指针
    }
    free(array);//释放第一维指针
    return 0;
    }
    4、动态数组创建后,不满足需求,继续扩大或缩小数组

    4.1缩小动态数组

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    intn,p;
    int i,n1,n2;
    printf(“请输入所要创建的动态数组的长度:”);
    scanf("%d",&n1);
    n=(int
    )calloc(n1,sizeof(int));
    for(i=0;i<n1;i++)
    {
    n[i]=i+1;
    if(i%5==0)
    printf("\n");
    printf("%d\t",n[i]);
    }
    printf("\n请输入所要缩小的动态数组的长度:");
    scanf("%d",&n2);
    p=(int
    )realloc(n,(n2)*sizeof(int));
    for(i=0;i<n2;i++)
    {
    if(i%5==0)
    printf("\n");
    printf("%d\t",p[i]);
    }
    printf("\n");
    free§;
    return 0;
    }
    4.2扩大动态数组

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    intn,p;
    int i,n1,n2;
    printf(“请输入所要创建的动态数组的长度:”);
    scanf("%d",&n1);
    n=(int
    )calloc(n1,sizeof(int));
    printf(“请输入所要扩展的动态数组的长度:”);
    scanf("%d",&n2);
    p=(int
    )realloc(n,(n2)*sizeof(int));//动态扩充数组
    for(i=0;i<n2;i++)
    {
    p[i]=i+1;
    if(i%5==0)
    printf("\n");
    printf("%d\t",p[i]);
    }
    free§;
    return 0;
    }

    展开全文
  • 问:为什么要动态分配内存 答1:因为内存太宝贵。 答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。 答3:给定一个占用...

    问:为什么要动态分配内存

    答1:因为内存太宝贵。

    答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。

    答3:给定一个占用内存可变大小的变量(假设是数组的长度len),给该变量通过函数动态分配内存后,分配内存的大小是根据数组的长度len决定的,假定用户输入len的大小是5,系统就会动态的给该数组分配长度为5的内存,该段代码运行结束后,系统调用free()函数释放分配的内存,然后接着运行剩下的程序。换句话说,动态分配内存可以根据需要去申请内存,用完后就还回去,让需要的程序用。

    问:什么时候需要动态分配内存

    答:当程序中有比较大的数据块需要使用内存的时候使用。原因:比较大的数据块如果使用了静态内存,在该数据块运行完毕后不能动态的释放该内存,直到整个程序运行完才能释放,如果整个程序比较大,有可能因为内存不够而发生错误。

    问:难道不可以在该静态分配的内存使用完后,使用free()函数释放吗?

    答:不可以,首先malloc() 函数和free()函数必须是配套使用,其次free()函数不能释放普通变量,只能释放指针。

    问:什么时候需要动态分配内存(网友整理:https://blog.csdn.net/sinat_39085247/article/details/74356820

    答:什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!

         计算机内存的四大区域:栈区,常量区,全局区,堆区(动态分配)

    1. 栈   区:在栈里面储存一些我们定义的局部变量以及形参;
    2. 常量区:主要是储存一些字符常量;
    3. 全局区:在全局区里储存一些全局变量和静态变量;
    4. 堆       :堆主要是通过动态分配的储存空间;

    以数组为例子来说明动态分配和释放内存

    #include<stdio.h>
    #include<malloc.h>
    int main()
    {
    	int len;//定义数组的长度
    	int *pArr=(int *)malloc(sizeof(int)*len);
    	for(int i=0;i<len;++i)
    		scanf("%d"\n,&pArr[i]);
    	for(i=0;i<len;++i)
    		printf("%d\n",*(pArr+i));
        free(pArr);  //pArr指向数组的首地址
        pArr = NULL;
        /*...
        剩余代码
        ...*/
    	return 0;
    	
    }

    问:为什么malloc函数前面需要int *的强制转换?

    答:因为程序需要告诉编译器malloc函数返回值的第一个字节是int *类型的还是其他类型的。

    1:代码中的malloch函数分配内存,在该段代码运行完后,通过free()函数释放,被释放的内存空间留着可以被剩余代码接着利用。

    2:同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针,何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!

    展开全文
  • C++中二维数组的动态分配
  • malloc()函数实现内存动态分配

    千次阅读 2020-12-26 17:07:42
    1.使用malloc()函数为数组分配内存 2.释放动态分配的内存 3. 其他动态内存分配函数
  • 强化学习算法的仿真,动态频谱分配,比较简单的算法供参考
  • 内存动态分配

    千次阅读 2020-01-30 21:17:07
    C库函数malloc,calloc,realloc,free的用法 *此博客仅用来记录博主的...分配所需的内存空间,并返回一个指向它的指针。(空类型,必要时可以转换) 参数(一个) size 内存块的大小,以字节为单位。 案例--...
  • C++动态分配分配内存空间

    千次阅读 2019-11-04 10:29:11
    动态分配存储空间的方法: #include <stdlib.h> // 申请size个字节的连续空间 void *malloc(size_t size); // 申请n个size个字节的连续空间 void *calloc(size_t n, size_t size); // 重置ptr为,指向size个...
  • 顺序表动态分配

    千次阅读 2021-01-29 23:27:14
    //顺序表动态分配 #include<stdio.h> #include<stdlib.h> #include<time.h> //使用随机函数时用到stdlib.h与time.h #define InitSize 10 typedef struct{ int *data; //指示动态分配数组的指针 ...
  • 在C中动态分配内存的基本步骤有: 1,用malloc类的函数分配内存; 2,用这些内存支持应用程序 3,用free函数释放内存 二、动态内存分配函数  malloc :从堆上分配内存  realloc : 在之前分配的内存块的基础上,将内存...
  • C语言结构体数组指针的动态分配

    千次阅读 2020-03-03 23:44:28
    于是,我们换一种方法,就是采用动态分配的方式。当程序解析出具体的设备类型后,在通过malloc函数,动态申请一块内存,供设备属性和数值的缓存使用。代码如下: int main(void) { void *pDevShadow; //刚开始...
  • 使用交通用户均衡的动态分配matlab管理工具包
  • ExecutorAllocationManager的作用已在《Spark2.1.0——SparkContext概述》一文有过介绍,更为准确地说,ExecutorAllocationManager是基于工作负载动态分配和删除Executor的代理。简单讲,ExecutorAllocationManager...
  • 有三种方法可以使计算机获得IP地址,即静态分配、动态分配。这两种方式依次说明如下。 1、静态分配IP地址。 静置分配又称手动分配。网路管理员直接设定电脑中使用的IP位址。在Windows系统中,用户可以手动配置...
  • 内存的静态分配和动态分配的区别主要是两个: **一是时间不同。**静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。 **二是空间不同。**堆都是动态分配的,没有静态分配的堆。栈有2种...
  • 用C/C++实现一个完整的(可变)动态分区管理器,包括分配,回收,分区碎片整理等。希望同学们实现如下功能: 初始化功能:内存状态设置为初始状态。 分配功能:要求至少使用两种算法,用户可以选择使用。 回收...
  • c语言 动态分配存储空间

    千次阅读 2019-10-05 14:56:41
    三种内置函数: ...为指针动态分配内存之后,指针就变成了数组。 返回数组:malloc前面需要强转,且有一个参数;calloc不需要,且有两个参数。 1. malloc: 2. calloc: 3. ralloc: ...
  • C/C++动态分配内存

    千次阅读 多人点赞 2018-04-05 13:41:36
    https://blog.csdn.net/Errors_In_Life/article/details/78889951https://blog.csdn.net/a573233077/article/details/50518909https://blog.csdn.net/weiwenhp/article/details/80065871.  需要动态分配...
  • 静态分配一个数组,由于没有使用动态分配内存的方式(malloc),所以并没有DestroyList(&L)函数,在程序结束后会自动销毁该数组。重要的操作有: InitList(&L) :初始化顺序表。 ListInsert(&L,i,e):...
  • 动态分配内存

    千次阅读 2016-08-23 16:26:57
    动态分配内存 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,...
  • C++ | 动态分配内存 new和malloc的区别

    千次阅读 2020-03-20 22:19:48
    动态分配内存是指程序在运行时才提出分配内存的要求,主要目的是让内存运用更有弹性。 动态分配内存后必须在程序结束前完成释放内存的操作。 如果程序运行期间分配的内存未释放,就会造成内存空间的浪费,形成所谓的...
  • annekang-5119093-Renforce_动态频谱分配_动态分配_频谱分配_强化学习动态频谱分配_vastuaa_源码.zip
  • annekang-5119093-Renforce_动态频谱分配_动态分配_频谱分配_强化学习动态频谱分配_vastuaa.zi
  • 【C语言】动态分配二维字符串数组

    万次阅读 多人点赞 2021-10-26 22:21:31
    动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 char**pps8Output = (char **) malloc(n * sizeof(char *)); 对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *...
  • 所谓动态内存分配就是指在程序执行的过程中动态分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是...
  • 前言 本博文基于VC++6.0开发调试 ...什么是内存的动态分配 C语言中的全局变量和局部变量分别分配内存的栈中的静态存储区和动态存储区,关于静态存储区和静态存储区之前的博客也有介绍, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 786,301
精华内容 314,520
关键字:

动态分配