zoukankan      html  css  js  c++  java
  • C语言动态数组空间分配问题

    **动态数组起源:**

    在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之, 如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。

    **申请原则:** 

    申请的时候从外层往里层,逐层申请;释放的时候从里层往外层,逐层释放。

    1. 一维数组分配与释放:

    * 分配:

    函数原型:char *p = (char *)malloc(m*sizeof(char));     //申请m个int大小空间的p数组

    //一维数组组名可以看成数组起始元素的首地址,p表示申请数组的首地址,表示申请char类型,m个char类型大小的空间

    * 释放:

    free(p);

    2.二维数组分配与释放:

    (1)使用二级指针:

    char **p = (char *)malloc(m*sizeof(char *));
    for(i=0;i<m;i++)
    {
          p[i]=(char *)malloc(n*sizeof(char *));
    }
    示例代码:
    #include <stdio.h> #include <stdlib.h> int main(void) {   int i, row, column, **arr;   while (scanf("%d %d", &row, &column) != EOF) {     arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址     for (i = 0; i < row; i ++) { // 按行分配每一列       arr[i] = (int *)malloc(sizeof(int) * column);     } // 释放开辟的二维数组空间     for (int i = 0; i < row; ++i)     {       free(*(arr + i));     }   } return 0; }

      

    (2)使用数组指针:

    char (*p)[3] = (char(*)[3])malloc(sizeof((char)*m*n);

    3.三维数组的分配与释放:

    分配:

    char ***p=(char* **)malloc(m*sizeof(char**));
    
    for(i=0;i<m:i++){
        p[i]=(char **)malloc(n*sizeof(char*));
        }
    for(i=0;i<m;i++){
       for(j=0;j<n;j++){
           p[i][j]=(char *)malloc(p*sizeof(char));
           }        
        }
    

      

    释放:

    for(i=0;i<m;i++){
    
       for(j=0;j<n;j++){
    
            free(p[i][j]);
        }
    }
    

      

    参考:

    1. http://www.runoob.com/w3cnote/c-dynamic-array.html

    2. https://blog.csdn.net/xckkcxxck/article/details/60141365

    3. https://blog.csdn.net/wzy_1988/article/details/9136373

    4. https://blog.csdn.net/hahachenchen789/article/details/77943255

    5. https://blog.csdn.net/lavorange/article/details/42879605 

  • 相关阅读:
    python框架---->APScheduler的使用
    python基础---->python的使用(六)
    python爬虫---->scrapy的使用(一)
    python基础---->python的使用(四)
    python基础---->python的使用(一)
    网页mp3播放代码
    js打开没有地址栏下拉条新窗口
    php全面获取url地址栏及各种参数
    php分页类
    php生成随机密码的几种方法
  • 原文地址:https://www.cnblogs.com/mark2018/p/9356926.html
Copyright © 2011-2022 走看看