2016-11-09 63 views
0

我正在嘗試在使用char數組的Linux VM中創建C程序。我發現每次我嘗試對數組做任何事情時,例如sizeof(),我得到了分段錯誤。我寫了一個測試程序,只是做了一個數組,並得到sizeof()作爲測試,果然我得到了同樣的錯誤。 我認爲這與在VM中運行的程序有關。下面是代碼:Kali Linux VM中的C分段錯誤

#include <stdio.h> 
#include <stdlib.h> 
#define ARR_LENGTH(x) sizeof(x)/sizeof(x[0]) 

int main() 
{ 
    printf("Hllo world!\n"); 
    int sent = 10; 
    char hello[] = {'a','b','c','d','e','f','g','h'}; 
    printf(sizeof(hello)); 
    printf(ARR_LENGTH(hello)); 
    return 0; 
} 

我失去的東西,或者是虛擬機可能是什麼問題?

+2

'printf(sizeof(hello));'不是你如何打印一個數字。 'printf'將使用該數字作爲'char *',這很可能導致分段錯誤。我很驚訝你的編譯器沒有警告你。 – Biffen

+0

......不,這與它在VM中運行無關。 (非常好奇你是如何得出這個結論的。) – Biffen

+1

在使用它們或者懷疑操作系統之前,閱讀你使用的標準函數的手冊頁是一個好主意。虛擬機將會對應用程序代碼產生影響。這是使用它的基本思想。 – Olaf

回答

3

您只需仔細閱讀printf()文檔。它不會把整數作爲第一個參數。

有問題的行是:

printf(sizeof(hello)); 
printf(ARR_LENGTH(hello)); 

它應該是:

printf("%zu\n", sizeof(hello)); 
printf("%zu\n", ARR_LENGTH(hello)); 

%zu是格式說明打印size_t值)。

我gcc編譯產生警告:

警告:傳遞 '的printf' 的參數1時將整數 指針,未作施放[-Wint轉換]

那些兩個語句。提高編譯器的警告級別(如果你沒有使用它們)。

+0

這並不能解決我原來的代碼,但它修復了這個問題中的代碼,所以我會接受它。有用的知道,無論如何:)謝謝! – dodo