另外glibc检测到free():无效的下一个大小(快)

时间:2013-12-24 18:12:52

标签: c malloc

请帮忙,我是C的新手,我不明白这个问题 我有3个文件 main.c,set.c,set.h 在set.h

typedef struct Set{unsigned char array[16];
}Set;

在main.c中 主要方法

int main
{
    int i=0;
    char *input="read_set A,0,1,2,3,4";
    char *output[LEN_ACTIONS];
    char *d=" ";

    read_input(input, output, d,0);
    char *methodName = output[0];
     printf("method name:%s\n", methodName);

    invoke_method(methodName, output);

    for(i=0; i < LEN_ACTIONS; i++)
        free(output[i]);

    return 0;
}

在set.c中

void read_input(char *input,char **output, char *delimiter, int onlyNumbers)
{    
    int index =0;
    char *str =(char*)malloc(strlen(input));
    strcpy(str, input);
    char *tok=NULL;
     tok = strtok(str,delimiter);

    while(tok!=NULL)
    {
        char *dup = (char*)malloc(strlen(tok)+1);
        if(dup)
        {
            if(onlyNumbers >0)
            {
                if(is_number(tok))
                 {
                    output[index] = strcpy(dup, tok);
                    index++;
                }
            }    
            else
            {
                output[index] = strcpy(dup, tok);
                 index++;
            }    
        }

        tok = strtok(NULL, delimiter);
    }
    free(str);
}

在main.c中

void invoke_method(char *methodName, char **output)
{
    int i=0;
    char *d=",";
    char *groups[5];
    read_input(output[1], groups, d, 0);

    if(strcmp(methodName,"read_set") ==0)
     {
        printf("group: %s\n", groups[0]);

        d=",";
        char *numbers[MAX_IN_SET]={NULL};
        read_input(output[1], numbers, d, 1);

        if(strcmp(groups[0], "A")==0)
         {
            printf("init A set\n");
            initialize_set(&A); //initialize the array with 0
            printf("input to set\n");
            read_set(&A, numbers);
        }
        if(strcmp(groups[0], "B")==0)
         {
            initialize_set(&B);
            read_set(&B, numbers);
        }
        if(strcmp(groups[0], "C")==0)
        {
            initialize_set(&C);
            read_set(&C, numbers);
         }
        if(strcmp(groups[0], "D")==0)
        {
            initialize_set(&D);
            read_set(&D, numbers);
        }
        if(strcmp(groups[0], "E")==0)
         {
            initialize_set(&E);
            read_set(&E, numbers);
        }
    }


    for(i=0; i<5; i++)
        free(groups[i]);
 }

在set.c中

void read_set(struct Set *set, char **numbers)
{
    int i=0;
    for(i=0; i<MAX_IN_SET; i++)
    {

        if(numbers[i] != NULL && numbers[i] != '\0')
        {
             int number = atoi(numbers[i]);
            int charIndex = number/8;
            int bitIndex = number %8;
            int bitPlace = 1<<(7-bitIndex);
            unsigned char c = (unsigned char)bitPlace;
             int numberExists = c & set->array[charIndex];
            if(!numberExists)
            {
                set->array[charIndex] = c|set->array[charIndex];
                /*printf("number %d has been added\n", number);*/
             }
        }
    }
}
在我运行此终端后

我收到错误

*检测到glibc * ./mainprog:free():下一个尺寸无效(快)

非常感谢

2 个答案:

答案 0 :(得分:1)

至少有一个问题:

char *str =(char*)malloc(strlen(input));

应该是

char *str =(char*)malloc(strlen(input) + 1);

或更好

char *str = strdup(input);

您没有为终止0分配空间,因此在堆数据结构上执行strcopy步骤。

使用valgrind查找更多问题(如果有)。

答案 1 :(得分:1)

可能的问题是释放char *数组的循环。其中之一是:

for(i=0; i < LEN_ACTIONS; i++)
    free(output[i]);

这取决于输入,但如果在该数组中没有分配LEN_ACTIONS条目,则空闲调用可能无效,因为数组未初始化为零(null)。一种可能性可能是预先初始化数组(因为将NULL传递给free是有效的)。在使用之前使用类似的东西:

memset(output, 0, sizeof(output));

groupsinvoke_method存在同样的潜在问题。