c - 从 C 中的双指针数组中删除单行?

标签 c arrays double-pointer

关于从双指针数组中删除单行有什么帮助吗? 例如,数组的每一行都包含一个名称字符串,例如 'J' 'o' 'h' 'n' '\0'。我想从这个充满名字的数组中删除一个名字。

char **p = malloc(arraySize*sizeof(char*));

for (i = 0;i < recordAmount;i++){
   fnames[i] = malloc(c*sizeof(char));
}

/* to summarize I scan the user data into array after I allocate memory to it */

free(*p[0]);

像上面的示例代码一样使用 free 后,我发现我想要释放的内存没有被释放,如果我去打印数组的内容,它最终会打印最初存在的数据,例如'J' 'o' 'h' 'n' '\0'。请记住数组中有多个名称。

最佳答案

首先,这里:

free(*p[0]);

您解除引用的次数超出了您的需要。您需要做的就是释放第一行:

free(p[0]);

释放后,内存被释放,对其进行读写是未定义的行为。如果你在释放后阅读,任何事情都可能发生:

  • 您最终可能会读回与您所写的内容完全相同的内容。
  • 您最终可能会阅读随机垃圾。
  • 您可能会导致程序崩溃。
  • 等等...

释放后,一般不需要做太多事情。但是,如果您想确保无法再访问数据(以避免未定义的行为),您可以将该特定指针设置为 NULL。这是一个非常常见的良好实践,用于避免释放后使用错误。

free(p[0]);
p[0] = NULL;

char *x = p[0]; // Fine, just reads NULL.
puts(x);        // Segmentation fault, trying to dereference NULL.
                // Memory corruption prevented.

关于c - 从 C 中的双指针数组中删除单行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789529/

相关文章:

c - 空指针 - 从闪存加载结构

代码仅在未使用的数组留在

c - 我如何从源代码静态构建 GDB?

arrays - Matlab 元胞数组数据

C、双指针和结构数组

c - 如何使用 scanf 函数获取具有 50 或更多数字的大输入

c - 在 C 中按一个选定的属性对结构体数组进行排序

python - 如何将数据从 meshgrid 格式转换为数组,反之亦然 : Python

c - 在 C 中释放双指针

c - C 中的段错误(核心已转储)- 使用 PTHREADS 时