码迷,mamicode.com
首页 > 编程语言 > 详细

C语言动态数组空间分配问题

时间:2018-07-23 22:13:20      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:str   csdn   空间   .net   执行   cpp   了解   html   存储   

**动态数组起源:**

在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,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

 

C语言动态数组空间分配问题

标签:str   csdn   空间   .net   执行   cpp   了解   html   存储   

原文地址:https://www.cnblogs.com/mark2018/p/9356926.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!