C函数中段错误的未知原因

时间:2013-10-01 19:47:22

标签: c pointers segmentation-fault

为什么这一行导致段错误?根据我对指针以及调试器输出的了解,分配应该有效。

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

3 个答案:

答案 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");

现在,你可以传递一个。因为你为它分配了内存。