2010-06-04 71 views
4

這一個可能很簡單,但我似乎無法得到它的工作。C:使用printf時出現分割錯誤

我有這個非常簡單的代碼片段:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 

    char buf[100]; 
    char *p = buf; 

    strcpy(p, "Test string"); 

    printf("%s\n", *p); 

} 

當我運行它導致分段錯誤。 GDB輸出:

Program received signal SIGSEGV, Segmentation fault. 
0xb76af3b3 in strlen() from /lib/i686/cmov/libc.so.6 

但我仍然不明白。

評論將不勝感激,謝謝。

+1

你可能已經看了GCC警告,以獲得問題的一個想法: test.c的:在函數「主」: 測試。c:12:警告:格式'%s'需要鍵入'char *',但參數2的類型爲'int' – 2010-06-04 17:23:47

+0

足夠滑稽我沒有得到那個警告信息,如果我這樣做了,我可能會挽救所有人,包括我自己:) – Hamza 2010-06-04 17:32:42

+0

您可能想要確保使用'-Wall'編譯器標誌來確保不會錯過警告。 – VeeArr 2010-06-04 18:53:07

回答

11

當你寫

printf("%s\n", *p); 

*p將在p[0]其值是一個字符。然而,printf正在尋找一個字符數組,從而導致它出現段錯誤。請記住,在C中,字符串只是字符數組,而數組實際上是指向第一個元素的指針,這就是爲什麼你不需要解引用。

爲了解決這個問題刪除*獲得:

printf("%s\n", p); 
+0

Hello Il-Bhima,感謝您的明確解釋。 – Hamza 2010-06-04 17:04:41

10

您正在將一個字符傳遞給printf;你應該傳遞指針。

char buf[100]; 
char *p = buf; 

strcpy(p, "Test string"); 

printf("%s\n", p);  // p, not *p 
+0

啊,是的。當我遵從p時,我得到一個字符,因此printf的混淆。這聽起來是對的嗎?謝謝。 – Hamza 2010-06-04 17:01:10

+0

+1成爲第一個回答 – neuro 2010-06-04 17:03:27

+2

當你通過'* p'時,你只傳遞一個字符值。當你傳遞'p'時,你傳遞一個指向字符串中第一個字符的指針,所以printf可以訪問字符串的其餘部分。 – zildjohn01 2010-06-04 17:05:51

3

更換

printf("%s\n", *p); 

printf("%s\n", p); 

當您使用%s,printf的期望你傳遞一個char*。您正在通過char

+0

嗨埃裏克,謝謝 - 修復它,雖然我不明白爲什麼。我們不應該引用指針來獲取內容嗎? – Hamza 2010-06-04 16:59:43

+0

@Hamza - 只有當你想打印一個字符。如果要打印整個字符串,則需要傳遞指針,以便printf可以訪問它。否則,它所擁有的就是你傳遞它的字符(而不是字符串的其餘部分)。這更有意義? – 2010-06-04 17:02:00

+0

這是我正在尋找的解釋,非常感謝!在使用高級語言一段時間之後忘記原理是多麼的容易:) – Hamza 2010-06-04 17:03:30

2

只是傳遞字符串(指針):

printf("%s\n", p); 

如果你要打印的第一個字符,則:

printf("%c\n", *p); 
+0

謝謝爲解釋AraK。 – Hamza 2010-06-04 17:04:03

4

使用此:

printf("%s\n", p); 

使用「 p「而不是」* p「

+0

感謝您的解答user358443 – Hamza 2010-06-04 17:05:41

0

%s的原因printf()的取消引用* P。假設字符串是「測試字符串」。 然後在我的Solaris sparc框中:(在一個測試程序中)p將「針對」地址0x54657374。該特定地址成爲過程空間的一部分的概率接近於零。

這是什麼導致了SIGSEGV信號(段錯誤)。