有谁知道第三行" Free(array)"呢?这里的数组只是数组第一个元素的地址(换句话说,指向int * right数组中第一个元素的指针)?为什么我们需要第三行来释放"列" 2D阵列?我基本上记住/理解a是一个指针,意味着保存____的地址。这句话是否正确?
例如:int ** a; int * b; int c; b =& c = 4; a =& b;这是对的吗?三江源!!!
另外,一般来说,双指针基本上是动态分配数组的吗?
"最后,当需要释放其中一个动态分配的多维数组时,''我们必须记住释放我们分配的每一块记忆。 (只是释放顶级指针,数组,不会削减它;如果我们这样做,所有二级指针都会丢失但不会被释放,并且会浪费内存。)这里的代码是什么可能看起来像:" http://www.eskimo.com/~scs/cclass/int/sx9b.html
for(i = 0; i < nrows; i++)
free(array[i]);
free(array);
答案 0 :(得分:2)
为什么我们需要第三行来释放&#34;列&#34;二维数组?
解除分配的数量应与分配数量相匹配。
如果您查看文档开头的代码:
int **array;
array = malloc(nrows * sizeof(int *));
for(i = 0; i < nrows; i++) {
array[i] = malloc(ncolumns * sizeof(int));
}
您会看到数组本身有一个malloc()
,每行有一个malloc()
。
释放它的代码反过来基本相同。
另外,一般来说,双指针基本上是动态分配的数组吗?
不一定。动态分配的数组是双指针的一种用途,但它远不是唯一的用途。
答案 1 :(得分:0)
调用malloc在堆上分配内存,等于其参数指定的字节数,并返回此内存块的地址。你的'2D数组'实际上是一个int地址的一维数组,每个数组都指向malloc分配的一块内存。完成后,您需要释放每个块,使其他人可以使用。但是你的1D数组实际上只是另一个用于保存这些malloc地址的malloc内存块,而且还需要释放它。
另外,当你使用printf(“%s”,array),其中array是char *时,编译器将数组视为array [0]的地址,但是将其打印出来?如果我理解它,我只是好奇。
是的,%s告诉printf转到你给它的任何地址(一个char的地址,也就是一个char *,让我们说),然后开始阅读并显示该地址内存中的任何内容,一个字符位于直到找到“空字符”的时间。所以在字符串的情况下,这是预期的行为,因为字符串只是一个字符数组,后跟'\ 0'字符。