为什么这一行导致段错误?根据我对指针以及调试器输出的了解,分配应该有效。
int delimChar(char **in ){ //in is a pointer to a pointer to the start of a
char del = '|'; // string with atleast two | characters
while (**in!=del){
(*in)++;
}
(*in)++;
char *temp = *in;
while(9001){
(*in)++;
if (**in == del){
break;
}
}
**in = '\0'; //This line causes a segfault, even though **in shows as
*in = temp; // '|' in debug output
return 0;
}
答案 0 :(得分:2)
我通过调用函数错误来复制它:
int main()
{
char *ptr = "one|two|three";
// Wrong! *ptr cannot be modified!
// delimChar(&ptr);
}
这是固定版本:
int main()
{
char val[] = "one|two|three";
char *ptr = val;
// Right
delimChar(&ptr);
}
答案 1 :(得分:0)
您确定该字符串包含至少两个“del”字符(例如“test | test | test”)而不仅仅包含一个(例如“test | test”)?
如果字符串只包含一个“del”字符,并且程序的“.data”或“.bss”部分与另一个内存缓冲区只读部分之间没有间隙(在Windows下,这几乎总是case)以下场景是可能的:
您的程序始终搜索“del”字符的第二次出现 - 即使字符串之前结束! (情况确实如此。)
程序将在字符串结尾后找到一个“del”字符,因为该字符串只包含一个“del”字符。这个“del”字符位于只读部分。
您尝试写入此“del”字符(尽管您已经在字符串之外)。
只是出于好奇:为什么“while(9001)”而不是“while(1)”?
答案 2 :(得分:-1)
如果不分配内存,则无法写入内存。
**in = '\0'; //This line causes a segfault, even though **in shows as '|' in debug**in = '\0'; //This line causes a segfault, even though **in shows as '|' in debug
是否为**分配了内存?它会在哪里写,在什么内存位置写? 当您只分配一个字符时,这意味着它是指向该字符串基址的指针。但那个字符串不在内存中。您应该使用以下内容。 例如。
char a[255][255];
strcpy(a[0],"HELLO WORLD");
现在,你可以传递一个。因为你为它分配了内存。