如何在C中释放2D动态数组



我的C代码中有这一部分。

char** argv_list = parse_cmdline(input);

parse_cmdline((还返回2D数组。我想释放argv_list。如何找到argv_list的行大小来释放它,如下所示:

for(int r = 0 ; r < rows ; r++)
{
free(argv_list[r]);
}
free(argv_list);

在C语言中,数组不是第一类对象。(这意味着C并不像通常支持对象那样支持数组。例如,您不能为整个数组分配"值"。(当您将数组传递给函数时,或者当函数返回数组时,它们衰减到指向其第一个元素的指针。换句话说,你没有办法知道原来的尺寸。

常见的方法是使用辅助整数变量(向其传递指针(来返回长度,或者使用sentinel值来标记数组的末尾。后一种约定用于C字符串,即最后使用的字符为空字符的字符数组。它也用于argv(main的第二个参数(,其中最后使用的arg是空指针。

在这里,由于函数返回指向字符串的指针(实际上是指向指针的指针(,最常见的方法是根据argv约定,将数组中最后使用的元素定义为NULL指针。

您无法在C中获得动态分配的数组的长度(2D或其他(。如果您需要这些信息,请在最初分配内存时将其保存到一个变量中(或者至少是一种计算方法(,并将指向内存的指针和内存大小一起传递。

您需要做的是在每次调用malloc()函数时跟踪数组的长度。

或者,您可以使用vmt在注释部分中建议的不同方法,每次调用malloc()函数时,您都可以在数组末尾显式地附加一个sentinel值,然后在该数组上循环,直到到达sentinel,以获取数组大小。

然后你可以使用

sizeof(array_size)/sizeof(array[0])

以便获取行号,然后在代码中使用它。

最新更新