arrays - 在 C 中使用 calloc() 和 free()
问题描述
我正在玩弄malloc
,calloc
和free
,我注意到编译器向我发送了 3 个警告:
- “警告 C6011 取消引用 NULL 指针 'ptr'。” 20号线
- “警告 C4022 'free':实际参数 1 的指针不匹配”第 20 行
- “警告 C4047 '=': 'int' 与 'void pointer' 的间接级别不同” 第 21 行
这是代码:
int main(int argc, char* argv[], char* envp[])
{
int* ptr = NULL;
int size_b = 30;
int i = 0;
ptr = (int*)calloc(size_b, sizeof(int));
if (ptr)
{
printf("%d", ptr[0]);
}
for (i; i < size_b; ++i)
{
free(ptr[i]); // Line 20
ptr[i] = NULL; // Line 21
}
return 0;
}
该程序运行,但我想知道这些错误的来源,以及是否有清除它们的方法。
解决方案
您正在分配在位置给您的一块内存ptr
要释放该内存,只需执行free(ptr);
您不要逐字释放;整个块一次被分配/释放(除非你realloc
分段做事)。
只需更换
for (i; i < size_b; ++i)
{
free(ptr[i]); // Line 20
ptr[i] = NULL; // Line 21
}
和
free(ptr);
你也不再需要i
了。为了安全起见,我还会将 delocation 移到下方if (ptr)
。
推荐阅读
- r - dplyr - 对 str_flatten 向量列进行排序
- python - 在没有 GIL 的情况下在 Cython 中并行化
- ruby-on-rails - Table_for 中关联资源的 ActiveAdmin 默认操作
- reactjs - 在 .map 循环中反应不必要的重新渲染
- javascript - 在使用 iframe 时键入安全的方法来检查 instanceof?
- c# - 用户 'root'@'localhost' 的 ASP.NET MVC MySQL 访问被拒绝(使用密码:否)
- excel - 将一张工作表复制到另一张工作表时,我的 VBA 代码会跳转到用户窗体中间宏,即使代码没有规定这一点
- java - Springboot 基本服务抛出 404(但它出现在 Swagger-ui 中)[已解决]
- python - 如何使用 glob.glob("") 按名称排除某些文件?
- mongoose - 在 Model.findOneAndUpdate 中使用事务