首页 > 解决方案 > 在 C 中使用 calloc() 和 free()

问题描述

我正在玩弄malloc,callocfree,我注意到编译器向我发送了 3 个警告:

  1. “警告 C6011 取消引用 NULL 指针 'ptr'。” 20号线
  2. “警告 C4022 'free':实际参数 1 的指针不匹配”第 20 行
  3. “警告 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;
}

该程序运行,但我想知道这些错误的来源,以及是否有清除它们的方法。

标签: arrayscdynamic-memory-allocationfreecalloc

解决方案


您正在分配在位置给您的一块内存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)


推荐阅读