【问题标题】:Free(): invalid pointer in C programFree():C 程序中的无效指针
【发布时间】:2021-05-16 03:27:36
【问题描述】:

我正在执行以下 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);
}

谁能给我建议解决方案?

【问题讨论】:

  • 你永远不会malloc(或callorreallocargv中的指针。然而你将它们传递给free
  • 另外,如果sizeof(char *) != 4(就像在典型的 64 位系统上一样),您认为会发生什么?
  • 别在意我的近距离投票,糟糕的重复。我懒得找更好的了。

标签: c dynamic-memory-allocation free c-strings calloc


【解决方案1】:

这个电话

char** argv = calloc(4, 10);

(注意:你的意思好像是

char** argv = calloc( 4, sizeof( char * ) );

尾注)

使用幻数10 只动态分配一个大小为4 * 10 的内存区,它等于40。因此,您只需为分配的范围调用一次函数free。这就是malloccalloc 被调用的次数与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;
}

【讨论】:

  • 非常感谢您的帮助。
  • @YogitaNegi 完全没有。不客气。:)
【解决方案2】:
free(*af);

尝试释放不是通过malloc/calloc分配的内存:

argv[argc++]="yogita";

"yogita" 是字符串文字,因此不是动态分配的。你不能释放它的内存。

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多