我使用select()
知道何时必须从stdin读取。我称这个函数为:
void
CLI()
{
char *line=(char*)malloc(sizeof(char)*32);
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
while(fgets(line, sizeof(line), stdin) != NULL)
{
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
if(cmd==NULL) break;
printf("cmd=%s, arg1=%s, arg2=%s",cmd,arg1,arg2);
}
free(line);
free(cmd);
free(arg1);
free(arg2);
}
输入示例:#set PAR 0
我得到了什么:
*** Error in './myprogram': double free or corruption (fasttop): 0x0000000001cc70f0 ***
我做错了什么?
答案 0 :(得分:3)
此处的问题是
fgets(line, sizeof(line), stdin
,不,这不是你想要的。 sizeof()
返回数据类型的大小,而不是指针指向的区域。您必须通过该指针提供可用的内存量,例如
while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted
通过对指针执行malloc()
分配后,使用赋值=
会导致内存泄漏。使用strcpy()
代替将<{em>} 由strtok()
返回到所需指针。
答案 1 :(得分:1)
删除
char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);
为什么呢?因为你malloc
ed的内存在这里丢失了:
cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");
strtok
返回char*
。您可以更改指针指向的位置。这会导致内存泄漏,因为您没有free
已分配的内存。你不需要
free(cmd);
free(arg1);
free(arg2);
如上所述删除了对malloc
的三次调用。
此外,Don't cast the result of malloc
and family。请注意sizeof(char)
为1,因为它与malloc
中不需要的其他数字相乘。