C语言动态分配二维数组内存

C语言内存管理主要包括malloc()、remalloc()、free()三个函数。

malloc原型 extern void *malloc(unsigned int num_bytes);

m行n列的 二维数组的分配,主要有三种方法:

一、分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//二维数组内存分配
int main()
{
int i,j,c=0;
int m,n;

int **p;
int *head;
scanf("%d %d",&m,&n);

p=(int **)malloc(sizeof(int *)*m);

if (p==NULL)
{
puts("memory allocation error!");
return;
}
//head=(int *)p+m; //指向数据内容起始的首地址
//memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零
for (i=0;i<m;i++)
{
//p[i]=head+(i*n); //both is ok
*(p+i)=(int *)malloc(sizeof(int)*n);
}
for(i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
*(*(p+i)+j)=c++;
}
}
for(i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%x: %4d\t",&p[i][j],p[i][j]);
}
printf("\n");
}
for (i=0;i<m;i++)
{
free(p[i]);
}
free(p);

system("pause");
return 0;
}

二、分配一个长度为m*n的一级指针(即一维数组),通过地址转换 来模拟二维数组的行为

代码较简单,略去

三、分配一个长度为m+m*n的二级指针,前m个地址分别存放后m*n个地址中每行的首地址


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//二维数组内存分配
int main()
{
int i,j,c=0; // i,j为下标,c为赋初值方便
int m,n; // m行 n列

int **p;
int *head;
scanf("%d %d",&m,&n);

p=(int **)malloc(sizeof(int *)*m+sizeof(int)*m*n);

if (p==NULL)
{
puts("memory allocation error!");
return;
}
head=(int *)p+m; //指向数据内容起始的首地址,注意地址转换
memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零
for (i=0;i<m;i++)
{
//p[i]=head+(i*n); //both is ok
*(p+i)=head+(i*n);
}
for(i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
*(*(p+i)+j)=c++;
}
}
for(i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%x: %4d\t",&p[i][j],p[i][j]);
}
printf("\n");
}
free(p);

system("pause");
return 0;
}

第一种方法需要分配m+1次内存,释放时也要先分别释放一级指针,再释放二级指针;

第三种方法分配连续的(m*n+m)*sizeof(int)个内存空间,操作较快。同时可以用p[i][j]下标方式访问。

内存分配需要用到sizeof(type); 指针加操作时
直接p+1效果为p的地址再加上sizeof(p)个字节。不能画蛇添足为p+sizeof(p)。

关键一:分配内存后必须判断是否分配成功

int *p=(int *)malloc(sizeof (int)*10);

if(p!=NULL)

// operate

关键二:分配内存
使用完成后必须释放,否则会造成内存泄露。***虽然操作系统也会对程序员申请的内存进行回收,但程序员有责任对自己申请的内存释放***。

free(p); //
腾讯上次面试 如何避免内存泄露,自己的回答是 类似写大括号 {}一样,malloc之后直接写上free();中间写自己的代码

C语言动态分配二维数组内存,布布扣,bubuko.com

时间: 2024-10-03 23:02:20

C语言动态分配二维数组内存的相关文章

C语言如何动态分配二维数组

C语言如何动态分配二维数组 使用malloc().free()函数进行动态分配,这两个函数包含于stdlib.h或malloc.h中 假如要申请一个3行5列的二维数组内存 1 #include <stdlib.h> 2 int main() 3 { 4 // 为二维数组分配3行 5 int **a = (int **)malloc(3 * sizeof(int *)); 6 // 为每行分配5列 7 for(int i = 0; i < 3; i++) 8 { 9 a[i] = (int

【二维数组内存申请】

前要:内存申请与释放 头文件:#include <stdlib.h> 申请: malloc(配置内存空间) 相关函数 calloc,free,realloc,brk函数原型 void * malloc(size_t size);一般使用时会将void改为自定义型如: double **pd=NULL; pd =(double **)malloc( sizeof(double *)*n); for(int i=0;i<n;i++) pd[i]=(double *)malloc(n*size

C语言之二维数组

二维数组及其指针 1 ) 在了解二维数组之前,我们先来了解一维数组及其指针 我们知道,一维数组中:数组名代表-->数组首元素的首地址    (千万不要认为是数组的首地址(&a),绝对不是) 在内存中,该代码的表现形式如下图:</span> #include<stdio.h>   {         int a[4];         int *p  = a;  //表明该指针指向了数组的首元素地址,当然也可以写为 int *p = &a[0];        

c++ 动态分配二维数组 new 二维数组

#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //建立一个16行5列的数组 int **p = new int*[16];//分配堆内存16个 int* for(int i = 0;i < 16;i++)//分配堆内存给每一个int* p[i] = new int[5]; //给这个数组赋值 int k = 0; f

【学习笔记】【C语言】二维数组

1. 什么是二维数组 一个数组能表示一个班人的年龄,如果想表示很多班呢? 什么是二维数组?int ages[3][10]; 三个班,每个班10个人 相当于3行10列 相当于装着3个一维数组 二维数组是一个特殊的一维数组:它的元素是一维数组.例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素 2.二维数组的定义 二维数组定义的一般形式是:     类型说明符 数组名[常量表达式1][常量表达式2] 其中常量表达式1表示第一维下标的

【C语言】二维数组做形参

二维数组有两种形式: ①在栈上: int a[4][4] = {...}; ②在堆堆上: int ** a = new int *[4]; for(int i = 0; i < 4; i++) a[i] = new int[4]; 这两种情况下,二维数组做形参的传参方式是不一样的. ①在栈上时 void fun(int * a, int rownum, int colmunnum)   //形参传递按照一维指针 { ... a[r * colmunnum + c] = ...;     //根据

C++二维数组内存分配

在C++中,用new和delete分配和释放内存: 1.例如,给一个4*5的二维数组分配内存 方法一:直接申请二维数组,逐一分配内存 1 int **array; 2 //分配内存 3 array=new int*[4]; 4 5 for (int i=0;i<4;i++) 6 array[i]=new int[5]; 7 8 //释放内存 9 for (int i=0;i<4;i++) 10 delete[] array[i]; 11 12 delete[] array; 方法二:按照一维数

C语言之二维数组与指针

二维数组: char a[2][3]; 二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下: #include "stdio.h" int main(int argc, char *argv[]) { char a[2][3]={{1,3,9},{2,4,8}}; for(int i=0; i<2;i++) for(int j=0;j <3;j++) { printf("a[%d][%d]=%

C语言 memcpy二维数组的复制

今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章已经练习过了 需要注意的问题是: 复制的本质是利用:行+变量字节数*列  这种表达,所以目标数组的行数一定是固定的 刚开始想到项目中行数是未知的,默认为空,结果程序逻辑问题,不停的溢出,所以要小心 #include <stdio.h> void print(int *data,size_t m,s