2016-06-24 92 views
-5

我知道unsigned int *和int *不兼容。但是因爲i,j是int *(int指針),那麼它們如何使用無符號類型進行打印。爲什麼它會輸出0!爲什麼輸出是這樣的?

#include<stdio.h> 
//#include<conio.h> 
main() 
{ 
    int *i,*j,**k; 
    //i+2; 
    k=&i; 
    printf("\n*k=%u j=%u i=%u",*k,j,i); 
    //getch(); 
} 

輸出:

*k=0 j=0 i=0 

它的295℃的問題,其中一個問題,我只是想了解是什麼在此代碼發生的事情!我沒有寫這個代碼!

+1

用於使用具有自動存儲持續時間的對象的值,而它沒有被初始化未定義行爲,未定義的行爲:

此外應使用%P

int main() { int *i,*j,**k; // Initialize i, j and k int x = 42; i = &x; j = &x; k=&i; // Use i, j and k printf("\n*k=%p j=%p i=%p",(void*)*k, (void*)j, (void*)i); return 0; } 

實施例輸出打印指針值將錯誤的類型傳遞給'printf()'。 – EOF

+0

這裏真正的問題是'i'和'j'都沒有被定義,因此也不是'* k'。你所做的只是打印未定義的值。至於格式,你是對的,'%u'應該傳遞'unsigned int'。 –

+0

使用正確的格式說明符來打印指針..閱讀此鏈接。可能對你有用..http://stackoverflow.com/questions/9053658/correct-format-specifier-to-print-pointer-address – sas

回答

2

正如註釋中所述,您在使用未初始化的變量時存在未定義的行爲,因此可能會打印任何內容(或程序可能會崩潰)。

所以確保在使用它們之前初始化變量。

*k=0xbfd9eb8c j=0xbfd9eb8c i=0xbfd9eb8c 
+0

亞我明白這一點,謝謝! – winter

1

這沒有任何意義。你聲明但不是初始化未定義行爲的變量。

最重要的是,您使用錯誤的格式說明符來打印它們,這也是未定義的行爲。

爲什麼輸出是這樣的?

因爲您濫用該語言,並因此而導致任何事情發生。它可能會因段錯誤而崩潰。它可以打印不同的垃圾值。它的全部未定義。

+0

我沒有寫代碼,它是295 C的問題之一的問題。只是想理智! – winter