为什么我用这个C代码会出现分段错误?

Rob*_*777 3 c pointers segmentation-fault

这段代码给了我一个分段错误:

char *s1 = "String 1", *s2 = "String 2";
void swap(char **, char **);

int main(void) {
    swap(&s1, &s2);
    return 0;
}

void swap(char **p, char **q) {
    char **tmp;

    *tmp = *p;
    *p = *q;
    *q = *tmp;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将最后一个函数的主体更改为此代码,则不会产生任何问题:

    char *tmp;

    tmp = *p;
    *p = *q;
    *q = tmp;
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么我的第一个代码会出现分段错误.提前致谢.

chr*_*ris 9

你的tmp指针未初始化,你在下一行中取消引用它.这是未定义的行为,包括段错误的可能性.

  • @ Robert777当你说"修复"时你的意思是你将你的代码更改为你在帖子中显示的第二个实现,其中`tmp`是`char*`或者你做了别的什么?如果不是其他的话,我很想知道是什么. (2认同)
  • @ Robert777,那不行:http://liveworkspace.org/code/2Pddhp%244.详细说来,当你说'*p =*q`时,`tmp'也会改变,因为它指的是与`p`相同的东西. (2认同)