动态申请二维数组, 无非就是通过指针来实现.@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("-", 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("-", matrix[i][j]);
- putchar((j < col - 1) ? '' :'\n');
- }
- }
- // 释放内存
- for (int i = 0; i < row; ++i) {
- free(matrix[i]);
- }
- free(matrix);
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3281584.html