c - 从C中的双指针数组中删除单行?
问题描述
从双指针数组中删除单行有什么帮助吗?例如,数组的每一行都包含一个名称字符串,例如'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]);
释放后,内存被释放,读写它是未定义的行为。如果你在释放后阅读,任何事情都可能发生:
- 你最终可以读回你写的完全相同的东西。
- 您最终可能会阅读随机垃圾。
- 您可能会导致程序崩溃。
- ETC...
释放后,一般不需要做更多的事情。但是,如果您想确保无法再访问数据(以避免未定义的行为),您可以将该特定指针设置为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.
推荐阅读
- android - 将存储在 MySql 数据库中的图像名称转换为 Android 中的 Drawable
- react-native - 在 react-native 中在 javascript 和本机代码(iOS - obj c,Android - java)之间传递数据?
- android - 恐慌:缺少“x86”CPU 的模拟器引擎程序。[Ionic Cordova 运行 android]
- java - 尝试检查首次 Firebase 登录
- r - 将同一组内的观察值与参考观察值进行比较
- angular - 下拉选择角 5 的单元测试
- powershell - 从word文档中提取文本
- dataframe - 数据框作为torchtext中的数据源
- ios - Constraining UIImageView height to respect dynamic UILabel height in UITableViewCell
- sql-server - SQL Server 2008 R2 中不同数据库排序规则之间的排序规则冲突