2012-07-22 96 views
0

我只是試圖測試我是否正確安裝了一個新的ide,並嘗試編譯這個基本程序,無論是在IDE中,還是使用gedit和GCC編譯,但是我在命令行啓動可執行文件後崩潰 - 我不知道什麼是錯誤的,因爲我對C語言中的指針還是比較新的,並且需要一段時間才能圍繞這個理論進行討論。C中帶有分割錯誤(核心轉儲)錯誤的指針

代碼:

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

    char print_func(char *hi); 

    int main(void) { 
     char *hi = "Hello, World!"; 
     print_func(*hi); 
    } 

    char print_func(char *hi) { 
     printf("%d \n", *hi); 
    } 

我嘗試這樣做:

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

char print_func(char *hi); 

int main(void) { 
    char *hi = "Hello, World!"; 
    print_func(&hi); 
} 

char print_func(char *hi) { 
    printf("%d \n", *hi); 
} 

,並沒有崩潰輸出44。

+2

寧可在'-pedantic'模式下運行GCC,或'-Wall'模式至少。代碼的兩個版本都被破壞:它們包含明顯的錯誤,這些錯誤將被編譯器檢測到並伴隨着診斷消息。事實上,即使在默認模式下,我也會從GCC獲取此代碼的診斷消息。你爲什麼忽略它們? – AnT 2012-07-22 14:55:06

+0

我不太確定,我還在學習。 – TheBlueCat 2012-07-22 14:59:55

+0

如果編譯器給你一條消息試圖幫助你;即使它只是一個警告它的線索,你做了一件壞事 – pm100 2013-09-03 17:39:40

回答

1

如果你使用間接尋址,print_func(*hi);你傳遞一個字符,它是一個字節。因此,當您嘗試讀取較大的整數時,會發生訪問衝突。你應該用指針print_func(hi)來調用你的函數。如果你想打印一個字符串的地址,它是更好地使用%p printf中:

printf("%p \n", hi); // print the address of hi 

如果你要打印的第一個字符喜,使用%c代替:

printf("%c \n", *hi); // print first character of hi 

如果你想打印在喜中第一個字符的值,使用%d代替,擁有鑄造:

printf("%d \n", (int)*hi); // print the value of the first character of hi 

要打印整個字符串使用%s並通過指針:

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

好吧,我想打印字符的值*嗨,而不是單元格地址。 – TheBlueCat 2012-07-22 14:55:00

+0

好吧,打印出一個H,是否需要將我的字符放到數組中,以打印出整個「字符串」本身。 – TheBlueCat 2012-07-22 14:57:43

+0

@TheBlueCat,更新了答案 – perreal 2012-07-22 14:59:53

0

即使在第二種情況下,我看到一個問題。

print_func(&hi); 

您正在傳遞指針的地址,而您只需傳遞指針本身。在函數調用中刪除&

0

那麼,你的函數正在等待一個字符串作爲參數,並且你發送一個字符或一個指向字符串的指針!

如果要打印字符串的第一個字符,則應該發送字符串。

print_func(hi); 
1

那是因爲你正在傳遞一個字符值的功能和給予,作爲地址在print_func指針變量「喜」。 如果你的程序的目的是打印字符串那麼這將是一件好事 - >

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

char print_func(char *hi); 

int main(void) { 
    char *hi = "Hello, World!"; 
    print_func(hi); 
} 

char print_func(char *hi) { 
    printf("%s \n", hi); 
}