【问题标题】:Deleting a single row from a double pointer array in C?从C中的双指针数组中删除单行?
【发布时间】:2019-11-10 14:19:51
【问题描述】:

对从双指针数组中删除单行有帮助吗? 例如,数组的每一行都包含一个名称字符串,例如'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'。请记住,数组中有多个名称。

【问题讨论】:

  • 从已释放的内存中访问数据是无效的(或者更好的是Undefined Behaviour)。你对这个结果很不走运(或幸运,取决于观点)。
  • 你释放了*p[0],这是错误的,你取消引用的次数太多了。 free(p[0]) 是你想要的。

标签: c arrays double-pointer


【解决方案1】:

首先,这里:

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.

【讨论】:

  • 完全有道理。设置为 NULL 让我忘记了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2022-06-11
  • 2021-12-29
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多