美文网首页
memset函数与动态二维数组初始化的问题

memset函数与动态二维数组初始化的问题

作者: MyFork | 来源:发表于2018-12-24 00:01 被阅读0次

在编写一个动态二维数组并且需要将其初始化时,出现了问题,相关部分如下:

    maze = new char*[m + 2];
    for (int i = 0; i <= m + 2; i++) {
        maze[i] = new char[n + 2];
    }
    memset(maze[i], '#', (n + 2) * sizeof(char));

编译可以通过,debug时发现错误在于数组越界(在后续调用这个数组时出现了错误,提示访问地址出错)

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            scanf_s("%c", &maze[i][j]);//报错
            //找到起点的位置
            if (maze[i][j] == 'S') {
                pos_m = i;
                pos_n = j;
            }
        }//for:j
        getchar();//getchar吃掉回车符
    }//for:i

先看微软官方对memset的解释
Microsoft Docs memset

具体原因如下:

  • memset函数只能够对连续的内存空间进行初始化。如果使用new()函数或是malloc()函数分配的内存可能会不连续,因此初始化时会出现错误。
  • 而如果是申请一个静态的数组如maze[25][25],其内存肯定是连续的,此时对maze()使用memset是不会出现错误的。

正确的使用方法:
因为是maze[i]相当于一个指向一个一维数组的指针,对每一个数组指针maze[i]开辟一个一维数组紧接着对这个一维数组进行初始化。
举例:

    char **maze = new char*[m+2];
    for (int i = 0; i <=m+2; i++) {
        maze[i] = new char[n+2];
        memset(maze[i], '#', (n + 2) * sizeof(char));
    }

特此做记录,避免重复踩坑。

相关文章

  • memset函数与动态二维数组初始化的问题

    在编写一个动态二维数组并且需要将其初始化时,出现了问题,相关部分如下: 编译可以通过,debug时发现错误在于数组...

  • 数组

    数组的初始化:动态初始化与静态初始化 数组元素的默认初始化值:image.png###二维数组: 如何遍历二维数组...

  • Day08

    二维数组 二维数组格式 二维数组初始化 二维数组的遍历 二维数组内存存储细节 二维数组与函数注意点: 主要是看函数...

  • 1.数据类型、类、package

    数组 1.数组静态初始化: 数组静态初始化简写: 2.数组的动态初始化 3.二维数组静态初始化: 4.二维数组动态...

  • 第三章③多维数组

    1.二维数组,可以看成一维数组里放得数组 二维数组的初始化 静态初始化;不用指出数组的长度,直接赋值动态初始化:先...

  • C++中memset函数的用法

    memset:char型初始化函数 头文件: 或 函数原型:void *memset(vo...

  • Java基础(数组)

    容器下的人儿呀, 你为何如此不变 数组 初始化 静态初始化 动态初始化 数组操作 常见异常 二维数组

  • 7.二维数组

    1.数组中储存数组就是二维数组 2.使用 定义 3.初始化 初始化1.动态初始化doubleArrs = new ...

  • int数组初始化

    一开始学习C++时,对int数组初始化时常常采用for循环将其初始化为0,实际上应该调用memset函数更简单。

  • C++ 中必知必会的 “工具”函数与类

    001 memset 在 C++ 语言中,memset() 函数是一个非常重要的初始化函数,他可以将指针所指向的一...

网友评论

      本文标题:memset函数与动态二维数组初始化的问题

      本文链接:https://www.haomeiwen.com/subject/mrgokqtx.html