我有这个程序读取一个字符串并将其分为三部分。第一部分是操作码,第二部分是数据,第三部分是关键。使用Valgrind错误 - 字符串拆分C
例子:
put this is stackoverflow
opcode: put
data: this is
key: stackoverflow
代码主营:
int main(int argc, char **argv){
char command[MAX_MSG];
fgets(command, sizeof(command), stdin);
command[strcspn (command, "\n")] = '\0';
char *aux_command = strdup(command);
char *opcode = strtok(command, " ");
int success = 0;
char *key ;
char *data;
if(strcmp(opcode, "put") == 0){
key = getKey(strdup(aux_command), opcode);
if(key == NULL){
printf("Invalid number of arguments.\n");
success = -1;
}
else{
data = getData(aux_command, opcode, key);
}
}
printf("opcode: %s\n",opcode);
printf("data: %s\n",data);
printf("key: %s\n",key);
free(aux_command);
}
我的问题是,当我运行我的程序与valgrind
它给出了这样的结果:
==2663== by 0x4EBD971: strdup (strdup.c:42)
...
==2663== definitely lost: 12 bytes in 1 blocks
==2663== indirectly lost: 0 bytes in 0 blocks
==2663== possibly lost: 0 bytes in 0 blocks
==2663== still reachable: 0 bytes in 0 blocks
==2663== suppressed: 0 bytes in 0 blocks
==2663==
==2663== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
我不不知道为什么会发生这种情况。谢谢。
绝对不使用'这里memmove'一件好事:你不能用它当源和目的地是重叠的,因为它是这里的情况。 – Bentoy13
为什么不只是在空间上使用命令字符串,使用第一个标记作为操作码,最后作为关键字,并将所有中间标记与空格连接以重构数据? – OlivierD
@ Bentoy13 memmove完全是为了处理重叠内存的唯一目的而存在的:http://en.cppreference.com/w/cpp/string/byte/memmove。 – OlivierD