C语言 将指向 char 数组的指针传递到函数时发生分段错误



这段代码工作正常,直到我修改它。

int main(int argc, char** argv)
{
char command[1024];
gets(command);
char *delim = " tf";
char **tokens;
int i=0;
/* Extracting tokens from command string */
for(tokens[i] = strtok(command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))
{
i++;
}
return 0;
}

这是在线因分段错误而崩溃的代码for(tokens[i] = strtok(command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))

代码

void commandProcess(char command[])
{
char *delim = " tf";
char **tokens;
int i=0;
/* Extracting tokens from command string */
for(tokens[i] = strtok(command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))
{
i++;
}
}
int main(int argc, char** argv)
{
char command[1024];
gets(command);
process(command);
return 0;
}

我知道char command[]衰减为指针链接,并且 strtok(( 修改了它的第一个参数,就我而言,它可能是一种未定义的行为。

链接那么,任何人都可以为我提供其他方法,以便我可以使用相同的函数签名并仍然避免问题吗?

这似乎是一个微不足道的问题,但我无法克服它。我什至试过这个,

void commandProcess(char command1[])
{
char command[1024];
int length = strlen(command1);
strncat(command, command1, length);
command[length] = '';
char *delim = " tf";
char **tokens;
int i=0;
/* Extracting tokens from command string */
for(tokens[i] = strtok(temp_command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))
{
i++;
}

但随后又在线崩溃

for(tokens[i] = strtok(temp_command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))

我认为delimtokens不是罪魁祸首,因为没有commandProcess((的程序可以很好地处理它们。

你写信给tokens[i],但tokens永远不会初始化。 取消引用未初始化的指针会调用未定义的行为。

这意味着代码的行为是不可预测的。 它可能会崩溃,可能会显示奇怪的结果,或者看起来可以正常工作。 此外,进行看似无关的代码更改可以更改未定义行为的表现方式。 这就是你的情况下发生的事情。

要解决此问题,您需要为tokens分配空间。 在这种情况下,最简单的方法是创建一个固定大小的指针数组:

char *tokens[1024];

您还可以malloc内存,这样堆栈上就不会有大型数组:

char **tokens = malloc(sizeof(char *) * 1024);

由于command的长度为 1024,因此令牌的数量不应更大。

正如其他评论和答案所指出的那样,您需要为收集的令牌指针分配空间。

这是一个固定版本,它也使用fgets()而不是过时和危险的gets(). 通常,不幸的是,fgets有点麻烦,因为它将尾随n留在缓冲区中。 然而,在这里,这是微不足道的,因为我们可以简单地将'n'添加到delim变量中,告诉strtok要拆分的内容。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXTOKS 100
void commandProcess(char command[])
{
char *delim = " tfrn";
char *tokens[MAXTOKS+1];
int i=0;
/* Extracting tokens from command string */
for(tokens[i] = strtok(command, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))
{
i++;
if(i > MAXTOKS)
{
fprintf(stderr, "too many tokensn");
exit(1);   
}
}
for(i = 0; tokens[i] != NULL; i++) printf("%d: "%s"n", i, tokens[i]);
}
int main(int argc, char** argv)
{
char command[1024];
fgets(command, sizeof(command), stdin);
commandProcess(command);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新