2013-04-05 67 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

相關問題