消除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 -
  • 25
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言动态二维数组的内存分配需要使用指针数组和一维数组的结合方式来实现。在使用动态二维数组时,可能会出现写入冲突的问题,造成程序的错误。 为了消除VS动态申请二维数组C6011C6385C6386警告,可以采取以下措施: 1. 使用calloc()函数申请内存时,要注意参数的顺序,第一个参数是行数,第二个参数是列数。 2. 在对动态二维数组进行读写操作时,要注意下标的范围,避免越界访问。 3. 在释放动态二维数组的内存时,要按照申请内存的顺序逐一释放,避免内存泄漏。 下面是一个示例代码,演示如何使用动态二维数组,并消除VS动态申请二维数组C6011C6385C6386警告: ``` #include <stdio.h> #include <stdlib.h> int main() { int i, j, rows, cols; int **arr; printf("Enter the number of rows: "); scanf("%d", &rows); printf("Enter the number of columns: "); scanf("%d", &cols); // 动态申请二维数组 arr = (int **)calloc(rows, sizeof(int *)); for (i = 0; i < rows; i++) { arr[i] = (int *)calloc(cols, sizeof(int)); } // 读入数组元素 for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("Enter the element at [%d][%d]: ", i, j); scanf("%d", &arr[i][j]); } } // 输出数组元素 printf("The array elements are:\n"); for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } // 释放动态申请的内存 for (i = 0; i < rows; i++) { free(arr[i]); } free(arr); return 0; } ``` 在上面的代码,我们使用了calloc()函数动态申请二维数组的内存,并遵循了释放内存的顺序。同时,我们还进行了越界访问的检查,避免了写入冲突的问题,消除VS动态申请二维数组C6011C6385C6386警告
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值