精华内容
下载资源
问答
  • 1、一维数组动态分配内存:... // 使用动态内存分配一个数组为 int num[5] int *num = NULL; int len = 5; num = (int *)malloc(len * sizeof(int)); for (int i = 0; i < len; i++) { num[i] = i; } ...

    1、一维数组动态分配内存:int num[5]

    源码:

    int main(void)
    {
    	// 使用动态内存分配一个数组为 int num[5] 
    	int *num = NULL;
    	int len = 5;
    	num = (int *)malloc(len * sizeof(int));
    	for (int i = 0; i < len; i++)
    	{
    		num[i] = i;
    	}
    	for (int i = 0; i < len; i++)
    	{
    		printf("num[%d] = %d, &num[%d] = %pn", i, num[i], i, &num[i]);
    	}
    	if (num != NULL)
    	{
    		free(num);
    		num = NULL;
    	}
    	return 0;
    }

    ① num = (int *)malloc(len * sizeof(int));

    在堆区分配了5个int型的内存空间,并将该内存空间的首元素地址返回给指针num,创建了一个数组为int num[5],如下图所示:

    60c646442ea8e818e79431a820a8b2eb.png

    ② 分配在堆区的内存空间地址是连续的,打印的结果如下:

    num[0] = 0, &num[0] = 01145B50
    num[1] = 1, &num[1] = 01145B54
    num[2] = 2, &num[2] = 01145B58
    num[3] = 3, &num[3] = 01145B5C
    num[4] = 4, &num[4] = 01145B60

    地址是4个字节递增,因为这里int型是4字节的,它跟在栈区定义数组 int num[5] 是一致的。

    ③ 在堆区动态分配的内存需要进行手动释放,不然会造成内存泄漏,使用free(num)。

    2、二维数组动态分配内存:char ptr[5][30]

    源码:

    int main(void)
    {
    	int n = 5;
    	// char *ptr[5];
    	char **ptr = (char **)malloc(n * sizeof(char *));
    	if (ptr == NULL)
    	{
    		printf("malloc failed!n");
    		return -1;
    	}
    	char buf[30];
    	for (int i = 0; i < n; i++)
    	{
    		// char ptr[5][30]
    		ptr[i] = (char *)malloc(30 * sizeof(char));
    		sprintf(buf, "Test%d:%dn", i, i);
    		strcpy(ptr[i], buf);
    	}
    	for (int i = 0; i < n; i++)
    	{
    		printf("%s", ptr[i]);
    	}
    	for (int i = 0; i < n; i++)
    	{
    		if (ptr[i] != NULL)
    		{
    			free(ptr[i]);
    			ptr[i] = NULL;
    		}
    	}
    	if (ptr != NULL)
    	{
    		free(ptr);
    		ptr = NULL;
    	}
    	system("pause");
    	return 0;
    }

    ① char **ptr = (char **)malloc(n * sizeof(char *));

    在堆区分配了5个char *指针类型的内存空间,并将该内存空间的首元素地址返回给二级指针ptr,相当于char *ptr[5]。

    注意:这里返回给二级指针是因为malloc分配完成后会将分配的内存空间首元素地址进行返回,而内存空间是5个char *的指针类型,即首元素是指针,返回的是指针的地址,所以需要使用二级指针取保存一级指针的地址。

    ② ptr[i] = (char *)malloc(30 * sizeof(char));

    在上面因为只分配了一个在堆区的内存空间存放5个char *类型,但是每个指针需要的内存空间是还没有分配的,所以需要对这5个指针在堆区内再次进行分配内存空间为30个char类型,相当于分配了二维数组ptr[5][30],如下图:

    95334e61ce4ac101403c8cf3d2ebb23c.png

    ③ 最后要释放在堆区分配的内存空间,不然会造成内存泄漏,释放顺序是先将ptr[0]-ptr[4]这5个分配的30个char类型字节的内存空间释放掉,接着再将二级指针ptr所指向在堆区分配的5个char *类型的内存空间给释放掉。

    展开全文
  • 1、一维数组动态分配内存:int num[5]源码:int ① num = (int *)malloc(len * sizeof(int));在堆区分配了5个int型的内存空间,并将该内存空间的首元素地址返回给指针num,创建了一个数组为int num[5],如下图所示:...

    1、一维数组动态分配内存:int num[5]

    源码:

    int 

    ① num = (int *)malloc(len * sizeof(int));

    在堆区分配了5个int型的内存空间,并将该内存空间的首元素地址返回给指针num,创建了一个数组为int num[5],如下图所示:

    v2-ed87a045b2c3753b5c0f79293f0aff67_b.jpg

    ② 分配在堆区的内存空间地址是连续的,打印的结果如下:

    num[0] = 0, &num[0] = 01145B50
    num[1] = 1, &num[1] = 01145B54
    num[2] = 2, &num[2] = 01145B58
    num[3] = 3, &num[3] = 01145B5C
    num[4] = 4, &num[4] = 01145B60

    地址是4个字节递增,因为这里int型是4字节的,它跟在栈区定义数组 int num[5] 是一致的。

    ③ 在堆区动态分配的内存需要进行手动释放,不然会造成内存泄漏,使用free(num)。

    2、二维数组动态分配内存:char ptr[5][30]

    源码:

    int 

    ① char **ptr = (char **)malloc(n * sizeof(char *));

    在堆区分配了5个char *指针类型的内存空间,并将该内存空间的首元素地址返回给二级指针ptr,相当于char *ptr[5]。

    注意:这里返回给二级指针是因为malloc分配完成后会将分配的内存空间首元素地址进行返回,而内存空间是5个char *的指针类型,即首元素是指针,返回的是指针的地址,所以需要使用二级指针取保存一级指针的地址。

    ② ptr[i] = (char *)malloc(30 * sizeof(char));

    在上面因为只分配了一个在堆区的内存空间存放5个char *类型,但是每个指针需要的内存空间是还没有分配的,所以需要对这5个指针在堆区内再次进行分配内存空间为30个char类型,相当于分配了二维数组ptr[5][30],如下图:

    v2-06f290c280b5728cf8314d7dc7bc43a5_b.jpg

    ③ 最后要释放在堆区分配的内存空间,不然会造成内存泄漏,释放顺序是先将ptr[0]-ptr[4]这5个分配的30个char类型字节的内存空间释放掉,接着再将二级指针ptr所指向在堆区分配的5个char *类型的内存空间给释放掉。

    展开全文
  • 动态分配二维数组内存需要使用指针的指针。多维数组的内存布局是不连续的,所以应首先为数组的第一个下标分配一个连续的数组。该数组的每个元素是指向另一个数组的指针,另一个数组保存的是第二个下标维度的元素。 ...

    如果希望在运行时确定多维数组的维数,可以使用堆数组。动态分配二维数组内存需要使用指针的指针。多维数组的内存布局是不连续的,所以应首先为数组的第一个下标分配一个连续的数组。该数组的每个元素是指向另一个数组的指针,另一个数组保存的是第二个下标维度的元素。

    分配内存的操作如下

    // 动态分配二维数组及赋值
    
    #include <iostream>
    using namespace std;
    
    int main() {
    	//动态分配二维数组内存
    	int ** ptr;
    	ptr = new int *[3];			
    	int i = 0;
    	for( i = 0; i < 3;++i){
    		ptr[i] = new int[3];
    	};
    	//
    	//数组赋值
    	int j;
    	for (i = 0; i < 3; ++i) {
    		for (j = 0; j < 3; ++j) {
    			ptr[i][j] = i+j;
    			cout << ptr[i][j] << " ";
    		}
    		cout << endl;
    	}
    	return 0;
    }
    

    上面代码的执行结果为

    0 1 2
    1 2 3
    2 3 4
    

    释放内存
    动态分配的二维数组的内存同样需要使用delete来释放,应注意使用循环来释放第一个下标分配的内存。释放内存的造作如下

    //内存释放
    	for (i = 0; i < 3; ++i) {
    		delete [] ptr[i];
    	}
    	delete [] ptr;
    	ptr = nullptr;
    	cout << "Memory is cleaned!" << endl;
    
    展开全文
  • 1、一维数组动态分配内存:int num... // 使用动态内存分配一个数组为 int num[5] int *num = NULL; int len = 5; num = (int *)malloc(len * sizeof(int)); for (int i = 0; i < len; i++) { num[i] = i...

    1、一维数组动态分配内存:int num[5]

    源码:

    int main(void)
    {
    	// 使用动态内存分配一个数组为 int num[5] 
    	int *num = NULL;
    	int len = 5;
    	num = (int *)malloc(len * sizeof(int));
    	for (int i = 0; i < len; i++)
    	{
    		num[i] = i;
    	}
    	for (int i = 0; i < len; i++)
    	{
    		printf("num[%d] = %d, &num[%d] = %p\n", i, num[i], i, &num[i]);
    	}
    	if (num != NULL)
    	{
    		free(num);
    		num = NULL;
    	}
    	return 0;
    }


    ① num = (int *)malloc(len * sizeof(int));
    在堆区分配了5个int型的内存空间,并将该内存空间的首元素地址返回给指针num,创建了一个数组为int num[5],如下图所示:
     

     

    ② 分配在堆区的内存空间地址是连续的,打印的结果如下: 

    num[0] = 0, &num[0] = 01145B50
    num[1] = 1, &num[1] = 01145B54
    num[2] = 2, &num[2] = 01145B58
    num[3] = 3, &num[3] = 01145B5C
    num[4] = 4, &num[4] = 01145B60

    地址是4个字节递增的,因为这里int型是4字节的,它跟在栈区定义数组 int num[5] 是一致的。

     

    ③ 在堆区动态分配的内存需要进行手动释放,不然会造成内存泄漏,使用free(num)。


     

     

    2、二维数组动态分配内存:char ptr[5][30]

    源码:

    int main(void)
    {
    	int n = 5;
    	// char *ptr[5];
    	char **ptr = (char **)malloc(n * sizeof(char *));
    	if (ptr == NULL)
    	{
    		printf("malloc failed!\n");
    		return -1;
    	}
    	char buf[30];
    	for (int i = 0; i < n; i++)
    	{
    		// char ptr[5][30]
    		ptr[i] = (char *)malloc(30 * sizeof(char));
    		sprintf(buf, "Test%d:%d\n", i, i);
    		strcpy(ptr[i], buf);
    	}
    	for (int i = 0; i < n; i++)
    	{
    		printf("%s", ptr[i]);
    	}
    	for (int i = 0; i < n; i++)
    	{
    		if (ptr[i] != NULL)
    		{
    			free(ptr[i]);
    			ptr[i] = NULL;
    		}
    	}
    	if (ptr != NULL)
    	{
    		free(ptr);
    		ptr = NULL;
    	}
    	system("pause");
    	return 0;
    }


    ① char **ptr = (char **)malloc(n * sizeof(char *));
    在堆区分配了5个char *指针类型的内存空间,并将该内存空间的首元素地址返回给二级指针ptr,相当于char *ptr[5]。
    注意:这里返回给二级指针是因为malloc分配完成后会将分配的内存空间首元素地址进行返回,而内存空间是5个char *的指针类型,即首元素是指针,返回的是指针的地址,所以需要使用二级指针取保存一级指针的地址。



    ② ptr[i] = (char *)malloc(30 * sizeof(char));
    在上面因为只分配了一个在堆区的内存空间存放5个char *类型,但是每个指针需要的内存空间是还没有分配的,所以需要对这5个指针在堆区内再次进行分配内存空间为30个char类型,相当于分配了二维数组ptr[5][30],如下图:


    ③ 最后要释放在堆区分配的内存空间,不然会造成内存泄漏,释放顺序是先将ptr[0]-ptr[4]这5个分配的30个char类型字节的内存空间释放掉,接着再将二级指针ptr所指向在堆区分配的5个char *类型的内存空间给释放掉。

    展开全文
  • C语言中动态分配二维数组 在C中动态分配内存的对于单个变量字符串一维数组等都是很容易的C中动态分配二维数组的方法很少有C语言书中描述我查找了有的C语言书中提到了一个方法 假定二维数组的维数为[M][N] 分配是...
  • C语言中动态分配二维数组 在C中动态分配内存的对于单个变量字符串一维数组等都是很容易的C中动态分配二维数组的方法很少有C语言书中描述我查找了有的C语言书中提到了一个方法 假定二维数组的维数为[M][N] 分配是可以...
  • 原文见链接C语言中动态分配二维数组 原文见链接C语言,动态分配二维字符串数组 原文见链接C++中二维数组的动态分配 原文见链接如何在C/C++中动态分配二维数组 原文见链接C语言 二维数组动态分配和释放 原文见...
  • 问题:如何动态非配一个二维数组内存,得到一个如char[i][j]数组,其中a,b都是变量。 解决方法:#include #include int main(){ int i = 10; int j = 20; //C语言可以这样: char** a = (char**)( malloc( i*...
  • C++中动态内存分配,某些数组在我们定义时并不能明确知道其范围,他们虽调用的变化而变化,当然我们也可以预定一个比较大的MAXNLEN但这种静态声明有时会浪费比较多的内存空间。我们可以用C++的动态内存分配机制来...
  • 动态分配二维数组

    2015-03-15 21:07:21
    文章转自 ... 动态分配空间连续的二维数组: ...最近做的一个东西需要动态分配大空间的二维数组,然后进行整块内存(缓冲区 buffer...动态分配二维数组的一般方法是这样:假设数组存的数据类型是int int **p=NULL; 
  • 1.malloc (1)malloc分配函数:需要给出申请空间大小(以字节为单位) ...(7)分配指定大小的内存空间,但是不会把分配的空间清0 (8)free(指针);//释放堆空间,标记删除,不清楚内容 (9)示例: ①malloc与一
  • C语言如何动态分配二维数组 使用malloc()、free()函数进行动态分配,这两个函数包含于stdlib.h或malloc.h中 假如要申请一个3行5列的二维数组内存 1 #include <stdlib.h> 2 int main() 3 { ...
  • #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //建立一个16行5列的数组 int **p = new int*[16];//分配内存16个 int* for...
  • 今天我们来聊聊二维数组及其二维数组动态内存分配关知识。 1.数组的基本定义 我们都知道,数组是典型的线性存储,是一种最基本的存储表示方法, 把逻辑上相邻的元素存储在物理位置相邻的存储单元中,由此得到的...
  • 1. 下面是为一维数组 / 二维数组 / 三维数组 动态分配内存 实现的代码: // 一维数组动态申请,a数组大小为: n int *a = new int[n]; // 二维数组动态申请,b数组大小为: n*p int **b = new int*[n]; ...
  • } // 动态内存分配方法 cout ; int u = 10; int** test = new int*[u]; for (size_t i = 0; i ; i++) { test[i] = new int [u]; } test[0][0] = 10; test[0][1] = 10; test[0][2] = sum; int v =...
  • //为二维数据动态分配内存 for(int i=0;i;i++) { arr[i] = (int *)malloc(m*sizeof(int)); } for(int i = 0; i ; i ++) for(int j = 0; j ; j ++)//读取breast.txt,放在arr[20][20]中 fscanf(fp,"%d...
  • 可以直接使用一维数组来模拟二维数组,下面的代码就是在此基础上,用一个二级指针指向一维数组的相应地方,详见代码 #include <...//malloc连续内存二维数组 int arr=(int)malloc(row*sizeof...
  • m:表示这个二维数组有多少个一维数组。n:表示每一个一维数组的元素有多少个。//例:int arr[][]=new int[3][2];如下图 格式二:数据类型[][] 数组名 = new 数据类型[m][];m:表示这个二维数组有多少个一维数组。列数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 752
精华内容 300
关键字:

动态内存分配二维数组