【问题标题】:Seg fault on code that should work according to the professor [duplicate]根据教授应该工作的代码段错误[重复]
【发布时间】:2013-10-09 07:03:40
【问题描述】:

除了 main 方法之外的所有东西都是我的教授写的,所以应该可以。作为参考,我很确定这段代码应该从字符串中删除任何重复的字母,将“blaahhhblah”变成“blahblah”。这段代码编译时没有错误或警告(在 1999 标准下编译),但是当我运行它时会出现段错误,我不知道为什么。我觉得这可能有一个明显的答案,但是我们在这门课程中没有使用书本,而且教授的教得也不是很好,所以我迷路了。

void g(char* a) {
  char* b = a;
  while(*b) {
    while(*a == *b)
      b++;
    a++;
    a* = b*;
  }
}

int main() {
  char* x = "blaahhhblah";
  g(x);
}

【问题讨论】:

  • char* x = "..." 声明了一个您无法可靠修改的常量字符串。参见,例如,stackoverflow.com/q/11058223/1281433 以获得解释。不过@Blastfurnace 的副本更好。
  • 您的主要方法中可能有问题。也许你有一个实际上没有分配的引用类型
  • 这不会编译。
  • a* = b*;做什么?除非您将其更改为 *a = *b,否则此代码不会编译;
  • "此代码编译时没有错误或警告" "b*" 不会编译得这么好。

标签: c string segmentation-fault


【解决方案1】:

问题来了。

a* = b*;  

将此更改为a = b*a = *b(取决于您要执行的操作,指针分配或指针指向的变量分配)。

还有

char* x = "blaahhhblah";  

应该是

char x[] = "blaahhhblah";

【讨论】:

    【解决方案2】:

    g 假定它传递的字符串是可变字符串。您的编译器(像大多数编译器一样)使文字字符串不可变。您正在传递 g 一个指向不可变字符串的指针。要解决此问题,您可以使用用文字初始化的数组,而不是文字 char*。所以:

    int main() {
      char x[] = "blaahhhblah";
      g(x);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2016-02-28
      相关资源
      最近更新 更多