zoukankan      html  css  js  c++  java
  • 消除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) ? ' ' : '
    ');
    		}
    	}
    	
    	// 释放内存
    	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("行数或列数不合法!
    ");
    		exit(-1);
    	}
    
    	// 动态申请内存
    	matrix = (int**)malloc(row * sizeof(int*));
    	
    	// 消除C6011警告
    	if (NULL == matrix) {
    		printf("无法动态申请内存!
    ");
    		exit(-1);
    	}
    
    	for (int i = 0; i < row; ++i) {
    		matrix[i] = (int*)malloc(col * sizeof(int));
    
    		// 消除C6011警告
    		if (NULL == matrix[i]) {
    			printf("无法动态申请内存!
    ");
    			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) ? ' ' : '
    ');
    		}
    	}
    	
    	// 释放内存
    	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 -
  • 相关阅读:
    画了朵花
    定位
    浮动
    盒模型
    html+css笔记1
    闭包
    高阶函数
    函数
    Map Set iterable
    git stash clear/drop 后代码如何恢复
  • 原文地址:https://www.cnblogs.com/wowpH/p/vs_6011_6385_6386.html
Copyright © 2011-2022 走看看