繁体   English   中英

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

[英]How to free 2D dynamic array in C

我的 C 代码中有这部分。

char** argv_list = parse_cmdline(input);

parse_cmdline() 也返回二维数组。 我想释放 argv_list。 如何找到 argv_list 的行大小来释放它,如下所示:

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

free(argv_list);

在 C 语言中,arrays 不是第一个 class 对象。 (This means C does not support arrays in all the ways it supports objects generally. For example, you cannot assign a “value” to an entire array.) When you pass an array to a function, or when a function returns an array,它们衰减为指向其第一个元素的指针。 换句话说,您无法知道原始尺寸。

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

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

您无法获得 C(二维或其他)中动态分配的 arrays 的长度。 如果您需要在最初分配 memory 并将指向 memory 的指针和 ZCD69B4957F06CD818D7BF3D61980E29 的大小一起传递时,将其保存到变量(或至少一种计算方法)中。

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

或者,您可以使用vmt在评论部分建议的不同方法,您可以在每次调用malloc() function 时在数组末尾显式 append 一个哨兵值,然后稍后在该数组上循环,直到到达哨兵获取数组大小。

然后你可以使用

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

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

暂无
暂无

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

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