动态内存分配和变长数组

作者:追风剑情 发布于:2019-11-27 20:07 分类:C

       变长数组(VLA)和调用malloc()在功能上有些重合。例如,两者都可用于创建在运行时确定大小的数组。不同的是,变长数组是自动存储类型。因此,程序在离开变长数组所在的块时,变长数组占用的内存空间会被自动释放,不必使用free()。另一方面,用malloc()创建的数组不必局限在一个函数内访问。例如,可以这样做:被调函数创建一个数组并返回指针,供主调函数访问,然后主调函数在末尾调用free()释放之前被调函数分配的内存。另外,free()所用的指针变量可以与malloc()的指针变量不同,但是两个指针必须储存相同的地址。但是,不能释放同一块内存两次。

       对多维数组而言,使用变长数组更方便。当然,也可以用malloc()创建二维数组,但是语法比较繁琐。如果编译器不支持变长数组特性,就只能固定二维数组的维度。

示例

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//malloc()、free()
#include <stdlib.h>

//argc: 参数个数 argv[]: 参数数组
//int main(int argc, char **argv)
int main(int argc, char *argv[])
{
	int n = 5;
	int m = 6;
	int * pi;
	//int ar2[n][m];//变长数组
	int (* p2)[6]; //C99之前的写法
	//int (* p3)[m]; //要求支持变长数组
	p2 = (int(*)[6]) malloc(n * 6 * sizeof(int)); //n x 6 数组
	//p3 = (int(*)[m]) malloc(n * m * sizeof(int)); //n x m 数组 (要求支持变长数组)
	pi = (int *)malloc(n * sizeof(int));
	pi[2] = -5;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			p2[i][j] = i * m + j;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			printf("%d ", p2[i][j]);
		}
		putchar('\n');
	}
			
	system("pause");
	return 0;
}

运行测试

1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号