繁体   English   中英

动态分配的二维数组

[英]Dynamically allocated 2 dimensional arrays

有人知道第三行“ Free(array)”是做什么的吗? 这里的array只是array的第一个元素的地址(换句话说,是指向int *数组中第一个元素的指针)? 为什么我们需要第三行来释放2D数组的“列”? 我基本上记住/理解a是指向a的指针,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);

为什么我们需要第三行来释放2D数组的“列”?

取消分配的数量应与分配的数量匹配。

如果您查看文档开头的代码:

int **array;
array = malloc(nrows * sizeof(int *));
for(i = 0; i < nrows; i++) {
    array[i] = malloc(ncolumns * sizeof(int));
}

你会看到,有一个malloc()用于数组本身和一个malloc()的每一行。

释放该代码的代码基本上相反。

而且,一般来说,双指针基本上是动态分配的数组,对吗?

不必要。 动态分配的数组是双指针的一种用途,但远非唯一的用途。

调用malloc在堆上分配内存,该内存等于其参数指定的字节数,并返回此内存块的地址。 您的“ 2D数组”实际上是一个由int地址组成的1D数组,每个地址都指向malloc分配的内存块。 完成后,您需要释放这些块中的每一个,以供其他人使用。 但是,您的一维数组实际上只是另一个由malloc分配的内存块,用于保存这些malloc分配的地址,并且还需要释放它们。

另外,当您使用printf(“%s”,array)(其中array是char *)时,编译器将数组视为array [0]的地址,但打印正确吗? 我只是好奇我是否理解正确。

是的,%s告诉printf转到您给它的任何地址(例如,一个字符的地址,又称一个字符*),然后开始读取并显示该地址中的内存内容,一次读取一个字符,直到显示为止找到一个“ NULL字符”。 因此,对于字符串,这是预期的行为,因为字符串只是一个字符数组,后跟'\\ 0'字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM