C函数中的分段错误

时间:2013-04-09 05:44:08

标签: c segmentation-fault

我正在尝试开发一个基本的shell。对于那个shell,我需要一个C函数来解析一个字符串。因为我是C的新手,我试图开发一个基本功能,它给了我一个分段错误错误。请告诉我我错过了什么。

#include<string.h>
#include<stdio.h>


void parse(char *msg);
int main()
{
    char *msg =  "This is a message";
    parse(msg);
}

void parse(char *msg){
    char *mm;
    mm = msg;

    char *tok;
    tok = strtok(mm," ");
    while(tok == NULL){
        tok = strtok(NULL," ");
            printf("%s \n",tok);
    }
}

错误消息(运行时)

Segmentation fault (core dumped)

提前致谢

6 个答案:

答案 0 :(得分:5)

msg指向字符串文字,并且您正在尝试修改它。在C中,修改字符串文字是undefined behaviour(实际上,编译器通常将它们放在只读内存中)。

要修复,请将msg转换为数组:

int main()
{
    char msg[] =  "This is a message";
    parse(msg);
}

此外,您的while循环存在一些问题:

1)条件是错误的方式;
2)第二次strtok()调用应在 printf()后出现

void parse(char *msg){
    char *mm = msg;
    char *tok = strtok(mm, " ");
    while (tok) {
        printf("%s \n",tok);
        tok = strtok(NULL," ");
    }
}

答案 1 :(得分:4)

您无法可靠地修改字符串文字;它们通常是只读的(在你的情况下,显然是只读)。尝试修改字符串文字会调用未定义的行为,这始终是Bad Thing™!

使用:

int main(void)
{
    char msg[] = "This is a message";
    parse(msg);
}

答案 2 :(得分:2)

您的定义:

char *msg =  "This is a message";

msg作为常量char字符串,无法修改。但strtok修改了它。

您可能想将其更改为

char *msg =  strdup("This is a message");

完成后不要忘记释放指针。

答案 3 :(得分:1)

也许不是

while(tok == NULL)

你的意思

while(tok != NULL)

或只是

while (tok) // <- because in C, conditions are always compared to 0

。但是,为您提供分段错误的原因是strtok修改了传递的字符串,这就是为什么它需要非const 指向char的原因(参见http://linux.die.net/man/3/strtok )。因此,因为您正在传递一个指向不可修改的字符串文字的指针,您会收到一个分段错误(这是您的运气;如果您运气不好,这个错误也可能会漏掉QA并投入生产)。

答案 4 :(得分:1)

一起去.........

#include<string.h>
#include<stdio.h>


void parse(char *msg);
int main()
{
    char msg[] =  "This is a message";
    parse(msg);
}

void parse(char *msg){
    char *mm;
    mm = msg;

    char *tok;
    tok = strtok(mm," ");
    while(tok != NULL){
        printf("%s \n",tok);
    tok = strtok(NULL," ");
    }
}

答案 5 :(得分:0)

如何将tok == NULL更改为tok!= NULL