消除VS中动态申请二维数组C6011,C6385,C6386的警告

动态申请二维数组,无非就是通过指针来实现。@wowpH
过程分三步:1、申请内存,2、使用数组,3、释放内存。
代码如下:

/********************************************************************
	description: 动态申请二维数组
	author: wowpH
	csdnid: pfdvnah
	date  : 2019-11-9 15:38:25
	from  : https://blog.csdn.net/pfdvnah/article/details/102987174
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int row, col;
	printf("输入行数和列数:");
	scanf_s("%d %d", &row, &col);
	
	int** matrix = NULL;// 初始化为NULL
	
	// 动态申请内存
	matrix = (int**)malloc(row * sizeof(int*));
	for (int i = 0; i < row; ++i) {
		matrix[i] = (int*)malloc(col * sizeof(int));
	}
	
	// 给二维数组赋值
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			matrix[i][j] = i * col + j;
		}
	}

	// 输出二维数组
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			printf("%2d", matrix[i][j]);
			putchar((j < col - 1) ? ' ' : '\n');
		}
	}
	
	// 释放内存
	for (int i = 0; i < row; ++i) {
		free(matrix[i]);
	}
	free(matrix);
	return 0;
}

这是最中规中矩的VS代码了。但是这段代码会出现 5 个警告(分 3 类):

严重性	代码	说明																					行
警告	C6011	取消对 NULL 指针“matrix[i]”的引用。														16
警告	C6386	写入到“matrix”时缓冲区溢出: 可写大小为“row*sizeof(int *)”个字节,但可能写入了“8”个字节。		11
警告	C6386	写入到“matrix[i]”时缓冲区溢出: 可写大小为“col*sizeof(int)”个字节,但可能写入了“8”个字节。	16
警告	C6385	从“matrix[i]”中读取的数据无效: 可读大小为“col*sizeof(int)”个字节,但可能读取了“8”个字节。	22
警告	C6385	从“matrix”中读取的数据无效: 可读大小为“row*sizeof(int *)”个字节,但可能读取了“8”个字节。		28

如何去掉这些警告呢?

安全的写法如下所示:

/********************************************************************
	description: 动态申请二维数组
	author: wowpH
	csdnid: pfdvnah
	date  : 2019-11-9 15:38:25
	from  : https://blog.csdn.net/pfdvnah/article/details/102987174
********************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int row, col;
	printf("输入行数和列数:");
	scanf_s("%d %d", &row, &col);
	
	int** matrix = NULL;// 初始化为NULL

	// 消除C6085和C6086警告
	if (row <= 0 || col <= 0) {
		printf("行数或列数不合法!\n");
		exit(-1);
	}

	// 动态申请内存
	matrix = (int**)malloc(row * sizeof(int*));
	
	// 消除C6011警告
	if (NULL == matrix) {
		printf("无法动态申请内存!\n");
		exit(-1);
	}

	for (int i = 0; i < row; ++i) {
		matrix[i] = (int*)malloc(col * sizeof(int));

		// 消除C6011警告
		if (NULL == matrix[i]) {
			printf("无法动态申请内存!\n");
			exit(-1);
		}
	}

	// 给二维数组赋值
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			matrix[i][j] = i * col + j;
		}
	}

	// 输出二维数组
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			printf("%2d", matrix[i][j]);
			putchar((j < col - 1) ? ' ' : '\n');
		}
	}
	
	// 释放内存
	for (int i = 0; i < row; ++i) {
		free(matrix[i]);
	}
	free(matrix);
	return 0;
}

原文链接https://blog.csdn.net/pfdvnah/article/details/102987174


- End - wowpH - pfdvnah -
posted @ 2019-11-10 17:25  wowpH  阅读(5224)  评论(0编辑  收藏  举报