C语言动态二维数组写入冲突,消除VS中动态申请二维数组C6011,C6385,C6386的警告,A.C...

消除VS中动态申请二维数组C6011,C6385,C6386的警告,A.C

动态申请二维数组,无非就是通过指针来实现。@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

#include

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

#include

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 -

http://www.dengb.com/Cyy/1379441.htmlwww.dengb.comtruehttp://www.dengb.com/Cyy/1379441.htmlTechArticle消除VS中动态申请二维数组C6011,C6385,C6386的警告,A.C 动态申请二维数组,无非就是通过指针来实现。@wowpH 过程分三步:1、申请内存,2、...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值