1

为什么这条线会导致段错误?根据我对指针以及调试器输出的了解,分配应该可以工作。

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;
}
4

3 回答 3

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);
}
于 2013-10-01T20:23:07.783 回答
0

您确定字符串包含至少两个“del”字符(例如“test | test | test”)而不是一个(例如“test | test”)?

如果字符串只包含一个“del”字符,并且程序的“.data”或“.bss”部分与另一个内存映射只读部分(在 Windows 下几乎总是如此)之间没有间隙,则以下情况是可能的:

您的程序总是搜索“del”字符的第二次出现 - 即使字符串之前结束!(绝对是这种情况。)

程序会在字符串的末尾找到一个“del”字符,因为该字符串只包含一个“del”字符。此“del”字符位于只读部分中。

您尝试写入此“del”字符(尽管您已经在字符串之外)。

只是为了好奇:为什么是“while(9001)”而不是“while(1)”?

于 2013-10-01T19:56:30.073 回答
-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

是否为 **in 分配了内存?它会写在哪里,它会写在什么内存位置?当您只分配一个字符时,这意味着它是指向该字符串的基地址的指针。但是那个字符串在内存中没有。您应该使用的是以下内容。例如。

char a[255][255]; 
strcpy(a[0],"HELLO WORLD");

现在,你可以通过了。因为你已经为它分配了内存。

于 2013-10-01T19:56:44.017 回答