请帮忙,我是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():下一个尺寸无效(快)
非常感谢
答案 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));
groups
内invoke_method
存在同样的潜在问题。