2015-11-28 24 views
-4

這個奇怪的輸出我與以下c程序的奇怪輸出混淆。 我使用TURBOC和DEVC編譯C - 爲什麼在printf()

我將非常高興,如果有人可以幫助我在這。

計劃

#include<stdio.h> 
#include<conio.h> 
int main() 
{ 
    clrscr(); 
    printf("%d","hb"); 

    printf("%d","abcde"-"abcde"); 
    //Output is -6 why ? 

    return 0; 

} 

輸出 對於TURBOC

printf("%d","hb"); 
//Output is 173 Why ? 
// No matter what I write in place of "hb" the output is always 173 

printf("%d","abcde"-"abcde"); 
//Output is -6 why ? 

對於開發的C

printf("%d","hb"); 
    //Output is 4210688 Why ? 
    // No matter what I write in place of "hb" the output is always 4210688 


printf("%d","abcde"-"abcde"); 
//Output is 0 why ? 
+0

你應該只寫'printf(「hdfetgdffgddb」)'。 – Schizo

+0

您使用了錯誤的類型轉換「%d」而不是「%s」。 %d是整數,%s是字符串 – Zorgatone

+6

未定義行爲未定義,集71837469. –

回答

-2

在這裏,你正在傳遞一個字符串(一char*)的內存地址:

printf("%d","hb"); 

然而,應使用的說明符是%p(靜置指針):

printf("%p\n", "hb"); // The output is in hexadecimal 

這將確保顯示它作爲當它被傳遞給時相同的表示尺寸用於由printfprintf。使用%dint說明符)將導致未定義的行爲,當sizeof(int)sizeof(char*)不相同時,即使大小相等,使用%d可能會導致打印負值(如果最高有效位被設置 - 符號位的int)。

對於任何內存地址,你可以不使用不同的工具鏈時,希望它是相同的程序重新編譯後,就更少了。

當輸出是改變"hb"字面用另一個之後的相同的,這意味着它是在相同的地址分配。

在這裏,兩個指針到字符串文字被減去:

printf("%d","abcde"-"abcde"); 

兩個指針相減的結果是通過將它們所指向的地址之間的這種類型的元件的數量。 但是請注意,行爲僅在指針指向來自同一數組的元素或數組結束後的第一個元素時才定義。

同樣,%d未必要使用的正確的說明符。可以使用大小至少等於指針類型的整數類型,可能爲long long int(應根據特定平臺檢查)。減法溢出仍可能發生,或者結果可能不適合投射類型,然後行爲再次未定義。

char *p1, *p2; // These should be initialized and NOT point to different arrays 
printf("%lld\n", (long long int)(p1 - p2)); 

還要注意,C標準庫提供stddef.h,它定義了用於存儲指針差ptrdiff_t類型。看到這一點:C: Which character should be used for ptrdiff_t in printf?

注:由於存在兩種不同的char數組,指針減法是不確定的,因此下面的信息只是基於假設,並提出只是因爲OP提到,這是一個參加考試。

在我們的例子中,由於sizeof(char)是1,它恰好表示字節的差異。 -6的區別是告訴兩個相同的文字"abcde"先放在第二個旁邊的內存中。文字包括字符串終止符,所以它的大小是6.

從這裏可以推出的另一件事是DevC++使用的編譯器是「更聰明」(或有其他優化選項傳遞給),創建內存中的單個副本爲"abcde",因此相差0

字符串文字通常放置在只讀內存中,程序不應該嘗試修改它,所以如果編譯器(或某些情況下的鏈接器)能夠「檢測」重複,它可能會重用以前的文字。

+0

非常感謝,你是唯一一個正確回答它的人! – prateek569

+0

@ prateek569不,實際上這是唯一不正確的答案。 –

+0

「但是請注意,只有當指針指向同一個數組中的元素時,或者在數組結束後的第一個元素時纔會定義行爲。」我不知道你從哪裏得到這些信息。我的意思是幾乎所有的東西都是錯的,但這是對語言本身的基本誤解。 – Blindy