【问题标题】:Why Do I Get a Segmentation Fault with this C Code?为什么这个 C 代码会出现分段错误?
【发布时间】:2013-03-28 12:13:21
【问题描述】:

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

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

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

    char *tmp;

    tmp = *p;
    *p = *q;
    *q = tmp;

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

【问题讨论】:

  • 提示:如果tmp 是指向某物的指针,tmp*tmp 有什么区别?
  • 如果你的第一个版本是char* tempmem; char **tmp = &tempmem; ...,它会工作(效率低下)

标签: c pointers segmentation-fault


【解决方案1】:

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

【讨论】:

  • @Robert777 当您说“已修复”时,您的意思是您将代码更改为您在帖子中显示的第二个实现,其中tmpchar * 还是您做了其他事情?如果有别的,我很想看看是什么。
  • @Robert777,这行不通:liveworkspace.org/code/2Pddhp%244。详细地说,当你说*p = *q 时,tmp 也会发生变化,因为它与p 指向相同的东西。
  • @Nik-Bougalis,是的,你是对的。我没有尝试打印它,只是查看了编译警告。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多