请帮忙,我对 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
也存在相同的潜在问题。