问题描述
我正在执行以下 C 程序并收到运行时错误“free(): Invalid Pointer”
#include<stdio.h>
#include<stdlib.h>
static void freeArgs(char** args);
int main()
{
char** argv = calloc(4,10);
int argc = 0;
argv[argc++]="yogita";
argv[argc++] ="negi";
argv[argc] = NULL;
freeArgs(argv);
return 0;
}
static void freeArgs(char** args)
{
char** af = args;
for (; *af; af++)
free(*af);
free(args);
}
谁能给我建议解决方案?
解决方法
free(*af);
尝试释放未通过 malloc
/calloc
分配的内存:
argv[argc++]="yogita";
"yogita"
是一个字符串文字,因此不是动态分配的。你不能释放它的内存。
这个电话
char** argv = calloc(4,10);
(注意:你的意思是
char** argv = calloc( 4,sizeof( char * ) );
尾注)
使用幻数 10
仅动态分配一个大小为 4 * 10
的内存区,它等于 40
。因此,您只需为分配的范围调用函数 free
一次。即 malloc
或 calloc
被调用的次数与 free
应该被调用的次数相同。
我怀疑你的意思是这样的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void freeArgs( char **args )
{
char **af = args;
while ( *af ) free( *af++ );
free( args );
}
int main(void)
{
enum { N = 4,LEN = 10 };
char **argv = calloc( N,sizeof( char * ) );
size_t argc = 0;
argv[argc] = malloc( LEN * sizeof( char ) );
strcpy( argv[argc++],"yogita" );
argv[argc] = malloc( LEN * sizeof( char ) );
strcpy( argv[argc++],"negi" );
freeArgs( argv );
return 0;
}