当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 消除VS中动态申请二维数组C6011,C6385,C6386的警告

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

2019年11月11日  | 移动技术网IT编程  | 我要评论

休闲西服,妖灵校园,无限巧克力吃法

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网