c++中memset的使用问题

int ***m = new int**[strLen];
for (int i = 0; i < strLen; i++)
        m[i] = new int*[strLen];
for (int i = 0; i < strLen; i++)
        for (int j = 0; j < strLen; j++)
                m[i][j] = new int[3];

memset的两种写法:
1. memset(m, 0, sizeof(int)*strLen*strLen*3);
2. memset(m, 0, sizeof(m));

那种是正确的???

 两个方法都不对
如果你希望清除m这个数组(每个下标指向null),用
memset(m, 0, sizeof(m) * sizeof(int **));
在此之前需要delete里面的二维数组,否则内存泄漏

如果你希望清除全部的元素
for (int i = 0; i < strLen; i++)
        for (int j = 0; j < strLen; j++)
                memset(m[i][j], 0, sizeof(m[i][j]) * sizeof(int));

你这里面涉及到三块内存空间,你想memset哪一块

  • 这种写法不对,如果你希望利用memset来清空m管理的数组,还是利用循环来清除吧。
  • 利用new分配的区块是连续的,但是两次new 得到的内存并不一定连续。
  • 下面这段代码把数组的地址都打印了出来,不过我没有delete,这不是个好习惯,赶着去上课呢。 > int ***m = new int**[10]; for (int i = 0; i < 10; i++) { m[i] = new int*[10]; } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { m[i][j] = new int[3]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 3; k++) { printf("m[%d][%d][%d]:%p\n", i, j, k, &m[i][j][k]); } } } >
  • memset是按字节连续填充的,大一的时候做过实验,memset(m[i][j],1,sizeof(int)*3);结果就不是1,当时还纠结了很久。
  • 所以希望清除全部元素,就像caozhy那样,利用循环逐个清除吧。
  • 循环体要写成下面这种形式,我打印sizeof(m[0][0])和sizeof(int)都是4,3个int应该是12字节。 >
  memset(m[i][j],0,sizeof(int)*3);
  • 这种写法不对,如果你希望利用memset来清空m管理的数组,还是利用循环来清除吧。
  • 利用new分配的区块是连续的,但是两次new 得到的内存并不一定连续。
  • 下面这段代码把数组的地址都打印了出来,不过我没有delete,这不是个好习惯,赶着去上课呢。 >int ***m = new int**[10]; for (int i = 0; i < 10; i++) { m[i] = new int*[10]; } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { m[i][j] = new int[3]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 3; k++) { printf("m[%d][%d][%d]:%p\n", i, j, k, &m[i][j][k]); } } } > * memset是按字节连续填充的,大一的时候做过实验,memset(m[i][j],1,sizeof(int)*3);结果就不是1,当时还纠结了很久。 * 所以希望清除全部元素,就像caozhy那样,利用循环逐个清除吧。 * 循环体要写成下面这种形式,我打印sizeof(m[0][0])和sizeof(int)都是4,3个int应该是12字节。
 memset(m[i][j],0,sizeof(int)*3);