C语言 交替检测到 glibc free():下一个大小无效(快速)



请帮忙,我对 C 语言很陌生,我不明白这个问题我有 3 个文件主.c, set.c, set.h在设置中

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

在主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:%sn", methodName);
    invoke_method(methodName, output);
    for(i=0; i < LEN_ACTIONS; i++)
        free(output[i]);
    return 0;
}

在设置中。

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);
}

在主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: %sn", 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 setn");
            initialize_set(&A); //initialize the array with 0
            printf("input to setn");
            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]);
 }

在设置中。

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] != '')
        {
             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 addedn", number);*/
             }
        }
    }
}

在终端中运行后,我收到错误

*

glibc 检测到* ./mainprog: free(): 无效的下一个大小 (fast)

谢谢

那里至少有一个问题:

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

应该是

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

或者更好

char *str = strdup(input);

您没有为终止 0 分配空间,因此请遵循堆数据结构上的 strcopy 步骤。

使用valgrind来发现更多问题,如果有的话。

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

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

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

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

invoke_method内部的groups也存在相同的潜在问题。

相关内容

  • 没有找到相关文章

最新更新