我会说得对。我有一个从套接字读取命令字符串的函数,然后将该字符串分解为结构:
typedef struct{
char* command;
char* option;
} Command;
如果命令字符串中没有选项Command.option = NULL
。出于此函数的目的,我们可以假设recv()'d数据在套接字的另一端验证。
以下是我遇到问题的功能:
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时,我发现段错误发生在cmd = strsep(&running, delimeters);
,但我不确定原因。 GCC没有警告我有关无效指针的信息,所以我认为这不是问题所在。我strdup()也是如此,所以写文字或数组或任何愚蠢的东西不应该有任何问题。老实说,我很难过。
此外,它只会抱怨实际上有空格的字符串(这是分隔字符)。单字命令工作正常。所以我想知道问题是当strsep尝试用'\ 0'写空间时?但为什么会这样呢?