【问题标题】:strsep() causes segfault - why?strsep() 导致段错误 - 为什么?
【发布时间】:2021-03-26 05:15:23
【问题描述】:

我对pointer-of-pointer-const-var-string-char 有点困惑;) 她是我的代码:

char* str_get_var(char *string,char delim)
{
        char    *found,
                *found2,
                *teststring;

printf("var string: %s\t",string);
teststring=strdup(string);
printf(" ---- var teststring: %s\n",teststring);

string=strdup(teststring);

found = strsep(&teststring,&delim);
printf("teststring \t var found: %s\n",found);
found2 = strsep(&string,&delim);
printf("string \t\t var found2: %s\n",found2);

return found;
}


int main(int argc, char *argv[])
{
char *message;
char trenner;
char *gefun;

message="ehzg=1";
trenner = '=';

printf("Start\n");
gefun=str_get_var(message,trenner);
printf("Ende\n");
return(0);
}

程序产生以下输出:

Start
var string: ehzg=1       ---- var teststring: ehzg=1
teststring       var found: ehzg
string           var found2: ehzg
Ende

正如您从代码中看到的那样,我会说不需要 strdup 到 teststring,因为我希望我可以直接使用 *string。 但是,只要我评论以下行,我就会收到 SegFault:

\\string=strdup(teststring);

她是注释掉时的输出:

Start
var string: ehzg=1       ---- var teststring: ehzg=1
teststring       var found: ehzg
Speicherzugriffsfehler

所以我的问题: 如何将*string 直接用于strsep? 为什么我在不使用相同内容执行 strdup 时会出现段错误?

(顺便说一句:在 Raspbian 上编码,如果重要的话)。

谢谢! /knebb

【问题讨论】:

  • 因为这就是 C 的工作方式。无法写入字符串文字。
  • 指针也不是只读的,它指向的数据是只读的。因此名称是 const char *,而只读指针是 char * const。
  • 这也是错误的,会导致未定义的行为:strsep(&string,&delim); delim 是单个字符,但 strsep 期望获得正确的 C 字符串,即以 nul 结尾的字符序列。跨度>
  • Krishna Kanth Yenumula 提供的链接解决了char*char[] 之间的区别。这应该会给你一些提示如何避免只读文字:改用数组。

标签: c string segmentation-fault


【解决方案1】:

strchr 可用于在文字字符串中查找=

#include <stdio.h>
#include <string.h>
char* str_get_var(char *string,char delim)
{
    char    *found2 = NULL;

    printf("var string: %s\t",string);

    found2 = strchr ( string, delim);
    if ( NULL != found2) {
        printf ( "string \t\t var found2: %s\n", found2);
    }

    return found2;
}

int main(int argc, char *argv[])
{
    char *message = "ehzg=1";
    char trenner = '=';
    char *gefun = NULL;

    printf ( "Start\n");
    gefun = str_get_var ( message, trenner);
    printf ( "Ende\n");
    if ( NULL != gefun) {
        printf ( "%.*s\n", (int)( gefun - message), message);
        printf ( "%s\n", gefun);
    }
    return(0);
}

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2018-06-09
    • 2011-05-20
    • 1970-01-01
    • 2011-01-03
    • 2021-07-18
    • 2020-04-15
    • 2012-03-08
    相关资源
    最近更新 更多