【发布时间】: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