我会直入主题。我有一个从套接字读取命令字符串的函数,然后将该字符串分解为一个结构:
typedef struct{
char* command;
char* option;
} Command;
如果命令字符串中没有选项,Command.option = NULL
. 出于此函数的目的,我们可以假设 recv() 的数据在套接字的另一端得到验证。
这是我遇到问题的功能:
Command* getCommand(int cfd)
{
Command* commandStruct = (Command*) malloc(sizeof commandStruct);
char cmdStr[200];
char *running, *cmd, *option;
char* delimeters = " ";
memset(cmdStr, '\0', 200);
memset(commandStruct, '\0', sizeof(commandStruct));
if(recv(cfd, cmdStr, MAXLINE, 0) == -1) errExit("recv");
verbosePrint(opts.v, "recv'd: %s\n", cmdStr);
running = strdupa(cmdStr);
verbosePrint(opts.v, "copied string\n");
cmd = strsep(&running, delimeters); //SEGFAULT OCCURRING HERE. WHY?
verbosePrint(opts.v, "separated string\n");
//If the string is longer than the one command then there's an option
if(strlen(cmdStr) > strlen(cmd))
{
verbosePrint(opts.v, "recieved a command with an option");
option = strsep(&running, delimeters);
commandStruct->option = (char*) malloc(strlen(option));
strcpy(commandStruct->option, option);
}
commandStruct->command = (char*) malloc(strlen(cmd));
strcpy(commandStruct->command, cmd);
return commandStruct;
}
当我使用 GDB 时,我发现 segfault 发生在cmd = strsep(&running, delimeters);
但我不知道为什么。GCC 没有就无效指针向我发出警告,所以我认为这不是问题所在。我 strdup() 也是如此,因此在文字或数组上写入或类似的任何愚蠢的东西不应该有任何问题。老实说,我很难过。
此外,它只抱怨实际上有空格的字符串(这是分隔符)。单字命令工作正常。所以我想知道问题是否出在 strsep 尝试用 '\0' 覆盖空间时?但为什么会这样呢?