【发布时间】:2021-10-09 00:35:45
【问题描述】:
我在玩 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;
}
程序运行,但我想知道这些错误的来源,以及是否有清除它们的方法。
【问题讨论】:
-
free()的参数必须是一个指针。ptr[i]是int,而不是指针。 -
基本上,
free()的参数必须是以前由malloc()、calloc()或realloc()返回的指针。ptr是唯一这样的指针,而不是ptr[i]。 -
您希望它做什么?当你分配一块内存时,你只能释放整个东西,你不能释放它的单个元素。
-
“程序运行”是一种错觉。第 20 和 21 行是undefined behavior。
-
没有 cmets,我们无法判断您希望这些代码行做什么。所以很难解释他们有什么问题。
标签: arrays c dynamic-memory-allocation free calloc