休闲西服,妖灵校园,无限巧克力吃法
动态申请二维数组,无非就是通过指针来实现。@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
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论