2015-01-03 13 views
5
#include<stdio.h> 
void main() 
{ 
    int i = 5; 
    printf("%p",i); 
} 

tôi đã cố gắng để biên dịch chương trình này trên Linux sử dụng trình biên dịch GCC mà về việc lập chương trình đưa ra một cảnh báo nóira bất ngờ khi in giá trị của một số nguyên

%p expects a void* pointer 

và khi chạy cho công suất 46600x3.

Nhưng khi tôi biên dịch trực tuyến bằng cách sử dụng trang web codingground.tutorialspoint.com tôi nhận được kết quả bằng 0x5 tức là một đầu ra thập lục phân, bất kỳ ai có thể vui lòng giải thích lý do không?

+0

Sử dụng '% d' để thay thế. – Maroun

Trả lời

6

%p hy vọng địa chỉ của một cái gì đó (hoặc một con trỏ). Bạn cung cấp giá trị của biến số i thay vì địa chỉ. Sử dụng

printf("%p",(void*)&i); 

thay vì

printf("%p",i); 

và GCC sẽ biên dịch chương trình mà không cần cảnh báo và nó sẽ in địa chỉ nơi i được lưu trữ khi bạn chạy nó. Dấu và (&) là toán tử địa chỉ và nó cung cấp địa chỉ của biến. Các diễn viên cũng là cần thiết như định dạng specifier %p hy vọng một đối số của loại void* trong khi &i là loại int*.


Nếu bạn muốn giá trị của biến được in, sử dụng

printf("%d",i); 

Sử dụng specifier định dạng sai sẽ dẫn đến UB(Undefined Behavior)

+1

'p' yêu cầu đối số' (void *) '. Bạn phải sử dụng 'printf ("% p ", (void *) &i);' – ouah

+0

@ouah, GCC không đưa ra bất kỳ cảnh báo nào mà không có dàn diễn viên. Ngoài ra, tôi nhận được kết quả tương tự nếu tôi có/không thêm dàn diễn viên. –

+0

gcc cảnh báo với '-pedantic', và có yêu cầu diễn viên. – ouah

4
printf("%p",i); 

Sử dụng trình định dạng sai sẽ dẫn đến hành vi không xác định. %p hy vọng đối số kiểu void * trong trường hợp của bạn, bạn đang đi qua giá trị của i và không phải là địa chỉ để in ra địa chỉ bạn nên vượt qua &i

Bạn nên sử dụng

printf("%d",i); 

để in các số nguyên giá trị của i

mã nên được như

#include<stdio.h> 
void main() 
{ 
    int i = 5; 
    printf("%d",i); /* To print value of i */ 
    printf("%p",(void *)&i); /* Address of variable i */ 
} 
+1

'p' yêu cầu một đối số' (void *) '. Bạn phải sử dụng 'printf ("% p ", (void *) &i);' – ouah

+0

@ouah Có tôi đã đề cập rằng trong câu trả lời của tôi đúc 'void *' trông dư thừa mặc dù bạn không cảm thấy như vậy? – Gopi

+1

Các diễn viên trong 'printf ("% p", (void *) &i); 'không thừa, nó được yêu cầu vì' & i' không thuộc loại 'void *'. – ouah

Các vấn đề liên quan