c - 将指向 char 数组的指针传递给函数时发生段错误

标签 c segmentation-fault

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

int main(int argc, char** argv)
{
    char command[1024];
    gets(command);
    char *delim = " \t\f";
    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(c​​ommand, delim); tokens[i] != NULL; tokens[i] = strtok(NULL, delim))

代码:

void commandProcess(char command[])
{
    char *delim = " \t\f";
    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[] 会衰减为指针 link ,并且 strtok() 修改了它的第一个参数,在我的例子中,它可能是一个未定义的行为。 link

那么,有谁能给我一些其他的解决方法,这样我就可以使用相同的函数签名来解决这个问题,并且仍然可以避免这个问题吗?

这似乎是一个微不足道的问题,但我无法解决。 :\我什至试过了,

void commandProcess(char command1[])
{
    char command[1024];
    int length = strlen(command1);
    strncat(command, command1, length);
    command[length] = '\0';

    char *delim = " \t\f";
    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 从未被初始化。取消引用未初始化的指针会调用 undefined behavior .

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

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

char *tokens[1024];

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

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

由于 command 的长度为 1024,因此 token 的数量不应再多。

关于c - 将指向 char 数组的指针传递给函数时发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851377/

相关文章:

c++ - 如何调试此类内存损坏?

c++ - 调用 gsl_integration 时出现段错误

c - 有什么方法可以保证段错误吗?

C:大字符串输入 --> 段错误

linux - 信号处理程序 (segv) 无法在设备崩溃前完成

c - 输入/输出;从文本文件读取值并计算数据

c++ - 任意精度小数运算中的 float 与有理数 (C/C++)

c - 为什么我可以单独打印每个字符,但不能整体打印?

c - 获取二叉树节点

c - memcpy unsigned int 到 unsigned char 段错误