消除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 -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM