【问题标题】:getting a "free(): invalid pointer" in c在c中获得“free():无效指针”
【发布时间】:2016-08-10 14:03:43
【问题描述】:

我是 C 语言的新手, 我的程序用于解析一个 txt 文件并将第一个单词保存在一个名为 File 的结构中。

例如: 对于包含以下内容的 txt 文件: 文件1:文件2,文件3 文件66:文件7

我想将 file1 和 file2 保存在一个结构中 什么时候 文件 1->名称=文件 1 fiel1->relation=[file2,file3]

但这只是对程序的一点解释。

问题是: 因为我不知道代表名称的字符数组的大小我试图使用 malloc 和 free 使用动态内存 在此过程中,我将 strtok 用于解析部分 问题从最后 4 行开始(在评论中标记) 我不断收到错误“free():无效指针:0x00007ffe6accfdd0 ***” (我在网站上寻找答案,但由于缺乏对指针的理解,我很难理解问题所在)。

谁能解释我为什么? 提前谢谢你

typedef struct File
{
char *name;
int *relation; 
}File;

char *error = BAD_FILE_MSG;
char buffer[MAX_LEN_SIZE];//the file buffer
if (argc != RIGHT_NUM_OF_PARAM) {
    fprintf(stderr, UNVALID_PARAMETER_MSG);
    return BAD_RET_VAL;
}
char *fileName = argv[1];
FILE *fp = fopen(argv[1], "r"); /* "r" = open for reading */
if (fp == NULL)
{

    fprintf(stderr, "%s %s", error, fileName);
    return BAD_RET_VAL;
}
if (ferror(fp) != 0)
{
    fprintf(stderr, "%s %s", error, fileName);
    return BAD_RET_VAL;
}
//int line = 0;//todo magic

while (fgets (buffer, sizeof(buffer), fp))
{
    /**
     * saving all the line in a char[]
     */
    //give memory to an array in file
    char *token;
    token = strtok (buffer, SIGN_FOR_SEPARATE);
    int marker = 0;//todo fix
    //creating a struct of a file
    File* fileStruct = (File*)malloc(sizeof(File));
    //creating a dynamic array of ints for relation
    fileStruct->relation = (int *)malloc(100 * sizeof(int));//todo free your mind
    char file[100];
    while (token != NULL)
    {
        if (marker == 0)
        {

            char* pointer = fileStruct->name;
            size_t size = strlen(token);
            //creating a dynamic array of chars for name
            fileStruct->name = (char *)malloc(size + 1);
            fileStruct->name = token;//**getting the error**
            free(pointer);
            marker++;
        }

【问题讨论】:

  • 请构造一个minimal test-case
  • File* fileStruct = (File*)malloc(sizeof(File)); [...] char* pointer = fileStruct->name; [...] free(pointer); 使用具有自动存储持续时间但其值不确定的对象的未定义行为。
  • 您将内存分配给fileStruct->name,然后覆盖该指针值。如果不出意外,这就是内存泄漏。同样,pointer 反映了 fileStruct->name 在其值被 malloc 调用覆盖之前的值。你有很多问题。
  • @EOF 你能给我一个网站的链接吗,因为我不能真正理解你所说的“未定义的行为”是什么意思,我首先保存了指针,所以我可以释放它,我不能真的明白我应该怎么做。指针的问题是我试图修复错误......显然我没有得到它的想法
  • @RafaelShakedGreenfeld:你从malloc()返回的未初始化内存中保存了一个不确定的值。

标签: c compiler-errors free


【解决方案1】:

我只关注导致您的错误的原因(我没有阅读您的大部分代码)。

指针是 C 语言中需要很长时间才能学习的概念之一,而且还有很长的路要走。
指针只是内存中的一个地址,没有别的。您可以将*pointer 视为一个函数调用,它表示“获取存储在指针中的数字,进入内存,并返回您在与该数字对应的地址处找到的值”。


当你说:

char* pointer = fileStruct->name;  

您没有以任何方式连接这两个变量。这就像说:

int foo = 3;
int bar = foo;

目前它们具有相同的值,但如果您更改 foo,bar 不会更改。

在您的代码中,您实际上并没有在任何地方使用指针,因此您可以直接 gt 摆脱它并在使用完毕后调用 free(fileStruct->name)


话虽如此,您需要更多练习/阅读/学习指针的工作原理。如果您刚开始一般地编程,您可能希望避免使用指针,直到您熟悉基础知识。

【讨论】:

  • thnx 伙计,我知道 java 和 python,但是 c 对我来说是一个新世界,我试图在几天内学习它,一周前我从未见过 c 中的程序....没有看到它的到来......它不像java,甚至不支持python......我尝试使用指针以艰难的方式学习,因为这是我一直学习如何做事的方式,我可以看到c的力量,但我需要放弃我的 java\python 习惯。无论如何,我回到书籍\youtube...
  • 很多人在使用指针时遇到了麻烦。坚持下去,祝你好运!
猜你喜欢
  • 2015-03-31
  • 2012-02-21
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2017-04-02
相关资源
最近更新 更多