获得" free():无效指针"在c

时间:2016-08-10 14:03:44

标签: c compiler-errors free

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

例如: 对于包含以下内容的txt文件: file1:file2,file3 file66:file7

我想将file1和file2保存在结构中 什么时候 file1->名称= file1的 fiel1->关系= [文件2,文件3]

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

问题是: 因为我不知道字符数组的大小代表我试图使用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++;
        }

1 个答案:

答案 0 :(得分:0)

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

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

当你说:

char* pointer = fileStruct->name;  

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

int foo = 3;
int bar = foo;

现在它们具有相同的值,但是如果你改变foo,bar就不会改变。

在你的代码中,你实际上并没有在任何地方使用指针,所以你可以在你完成它之后去掉它并调用free(fileStruct->name)

话虽这么说,你需要更多关于指针如何工作的练习/阅读/学习。如果你刚刚开始编程,你可能想要一直避免使用指针,直到你对基础知识感到满意为止。