我的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])
以便获取行号,然后在代码中使用它。