2013-04-05 68 views
3

此代码给了我一个分段错误:为什么使用此C代码得到分段错误?

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; 

我真的不了解为什么我会在第一个代码中得到分段错误。 在此先感谢。

+0

提示:如果'tmp'是指向某物的'tmp'和'* tmp'有什么区别? – 2013-04-05 22:49:26

+0

如果你的第一个版本是'char * tempmem; char ** tmp =&tempmem; ...' – 2013-04-05 22:57:03

回答

9

您的tmp指针未初始化,您在下一行中将其解除引用。这是未定义的行为,其中包括段错误的可能性。

+0

谢谢!我已修复它,现在它的工作原理:) – Robert777 2013-04-05 22:49:24

+2

@ Robert777当你说“修复”时,你的意思是你改变了你的代码到你在帖子中显示的第二个实现,其中'tmp'是'char *'或者你做别的事吗?如果有其他事情,我会很好奇,看看有什么。 – 2013-04-05 22:51:40

+0

@ Nik-Bougalis,我用新的代码编辑了我的帖子。 – Robert777 2013-04-05 23:00:14

相关问题