问题描述
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int** intptrArray;
char word[50];
在此之后的函数中使用malloc分配数组和单词后,我试图在数组和单词上都使用free()。 free(intptrArray)似乎工作得很好,但是每次我尝试free(word),free(* word)或free(&word)时,都会出现错误-最常见的是“尝试释放非堆对象”。
我该如何解决? TIA!
解决方法
如何释放非堆对象?你没有。
free
的目的是使分配的堆内存可用于程序的其他用途。因此,您应该只传递从free
/ malloc
/ calloc
返回的realloc
指针值。
在分配后试图在数组和单词上都使用free() 。
似乎您不理解函数如何接受具有数组类型的参数。
我可以猜到您在做什么与以下程序类似。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f( char word[] )
{
word = malloc( 50 * sizeof( char ) );
strcpy( word,"Hello World!" );
puts( word );
}
int main(void)
{
char word[50] = "Bye!";
f( word );
puts( word );
return 0;
}
程序输出
Hello World!
Bye!
您可以看到数组word
未被更改。在函数中,您没有更改main中声明的数组word
。当您将数组传递给函数f
时,它会隐式转换为char *
类型的指针。该指针(参数)是函数的局部变量。因此,您更改了局部变量。在main中声明的数组本身既未更改也未重新分配。它具有自动存储的持续时间,由编译器在函数main完成执行后释放声明的数组。
另一方面,实际上必须释放函数word
的参数f
所指向的已分配内存。否则会发生内存泄漏。可以在功能内完成,例如
void f( char word[] )
{
word = malloc( 50 * sizeof( char ) );
strcpy( word,"Hello World!" );
puts( word );
free( word );
}