2017-03-17 114 views
4

我正在測試此代碼,但爲什麼沒有錯誤呢?沒有錯誤,爲什麼?

#include <stdio.h> 

int main() 
{ 

    int a = 1025; 
    int *p; 
    p = &a; 

    // now I declare a char variable , 
    char *p0; 
    p0 = (char*) p; // type casting 
    printf("", sizeof(char)); 

    // is %d correct here ????? 
    printf("Address = %d, value = %d\n", p0, *p0); 

} 

我的問題: 是%d正確的嗎?因爲%d是整數不是字符,爲什麼沒有錯誤呢?

+1

其實問題是你傳遞地址的第一個'%d':你應該使用'%p'。 'printf(「Address =%p,value =%d \ n」,(void *)p0,* p0);'對於第二個'char'值只是提升爲'int'。 – LPs

+0

此外,錯誤/警告還取決於您如何編譯代碼:使用'gcc -Wall -Wextra -pedantic-errors test.c -o test -std = c11 -g',您有'warning':format'%d'需要參數類型'int',但參數2的類型爲'char *'[-Wformat =] printf(「Address =%d,value =%d \ n」,p0,* p0);' – LPs

+0

[格式正確說明符打印指針(地址)?](http://stackoverflow.com/q/9053658/995714) –

回答

4

在你的情況

p0 = (char*) p; 

是有效的,因爲char *可用於訪問任何其他類型。相關,引用C11,章§6.3.2.3

[...]當一個指向對象轉換爲一個指向字符類型, 結果點到最低尋址的對象的字節。 結果的連續增量,直到對象的大小,產生指向對象剩餘字節的指針。

然而,在

printf("Address = %d, value = %d\n", p0, *p0); 

情況下導致undefined behavior,因爲你傳遞一個指針(p0)到%d(看轉換符和對應參數的第一個「對」)。您應該使用%p,並投了參數void *,像

printf("Address = %p, value = %d\n", (void *)p0, *p0); 

然後,回答

沒有錯誤可言,爲什麼呢?

因爲問題不在於編譯器應該抱怨的語法或任何約束衝突。這是純粹錯誤使用給定的電源。 :)

+0

請注意,一些編譯器警告格式說明符不匹配。例如。最近版本的gcc和clang加上'-Wall' –

+0

謝謝@Sourav Ghosh –

+0

@ M.M .:也有很多非版本的版本。它當然在2.95(c。1999)中出現,我認爲它已經很老了。 – rici

1

它是未定義的行爲,因爲p0char*,代碼printf("Address = %d, value = %d\n", p0, *p0)%d不是字符指針的有效轉換說明符。

+2

'約束違規'...你能詳細說明嗎? –

+0

謝謝,只是downvoted,因爲你是絕對錯誤的。 :) –

+0

@SouravGhosh你好先生,我改變了我的答案。 – rsp

相關問題