2014-01-21 72 views
0

我正在學習C,並且正在編寫一個小程序,用於在指針中打印地址以及地址值。我看到沒有錯誤,只是我的代碼打印語句。但是我在使用指針的時候遇到了一些問題。C:瞭解指針,打印地址失敗

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 

    char a[] = "Hellow World"; // create an arry 

    char *ap = a;   // create a pointer and set the address to `a` 

    int i = 0;   // create a counter 


    while (*ap) // while inside the array 
    { 
     // print the address and contents of array content 
     printf("Addr: %x, %c\n", ap, *ap); 

     ap++; // increment through the array 
    } 

    // Crash the program, using an array 
    for (ap = a, i = 0; i<20; i++){ 
     *(ap+i) = '\0'; 
    } 

    return 0; 
} 

編譯:

gcc -Wall -g -o bin/pointer2.c source/pointer2.c 

錯誤:

source/pointer2.c: In function ‘main’: 
source/pointer2.c:16:3: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char *’ [-Wformat=] 
    printf("Addr: %x, %c\n", ap, *ap); 

當我嘗試在格式化爲一個字符串,而不是十六進制的我得到這個輸出。

print語句:

printf("Addr: %s, %c\n", ap, *ap); 

輸出:

Addr: Hellow World, H 
Addr: ellow World, e 
Addr: llow World, l 
Addr: low World, l 
Addr: ow World, o 
Addr: w World, w 
Addr: World, 
Addr: World, W 
Addr: orld, o 
Addr: rld, r 
Addr: ld, l 
Addr: d, d 
+0

對於地址你能給%p – const

+0

而你正在訪問非法地址因爲sizeof(a)<20 – moeCake

回答

2

使用%p打印指針的地址,而不是%x。正如警告所說,%x期望參數是一個整數,而不是指針。

+0

我看到,出於某種原因,我以爲我在使用指針錯誤,因爲它要求一個整數。感謝您的幫助,代碼現在可以工作 – Crispy

+0

我從c學習源複製了這段代碼,他們在windows xp上。在Windows環境中使用%x是否工作?是否需要或可以的Windows操作系統也使用%p? – Crispy

+0

它可能會在兩種環境下工作。該消息只是一個警告。 GCC做了額外的檢查,Windows編譯器沒有。 – Barmar

-1

對於在C中使用%u代替%x來打印地址,它會以十進制形式給出您的地址。 ,你可以使用%P,它會給你在十六進制格式

0

從ISO/IEC 9899:TC3

%x被desrcibed爲:

o,u,x,X

The unsigned int argument is converted to unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal notation (x or X) in the style dddd; the letters abcdef are used for x conversion and the letters ABCDEF for X conversion. The precision specifies the minimum number of digits to appear; if the value being converted can be represented in fewer digits, it is expanded with leading zeros. The default precision is 1. The result of converting a zero value with a precision of zero is no characters.

,而不是你應該使用%p 其描述按標準爲:

p

The argument shall be a pointer to void. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner.