動態申請二維陣列,無非就是通過指標來實作,@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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65030.html
標籤:C
上一篇:圖的深度遍歷和廣度遍歷
