2017-02-23 11 views
5

printf% पी प्रारूप निर्दिष्ट करने के लिए ध्वज के रूप में '0' जोड़ रहा है या नहीं?printf प्रारूप विनिर्देशक% p के लिए ध्वज '0', सही या नहीं?

#include <stdio.h> 
int main() 
{ 
    int a = 42; 
    void* p = &a; 
    printf("Pointer address: %08p", p); 
    return 0; 
} 

Ideone पर भी।

कुछ ऊपर के समान कोड संकलन, मैं कोई चेतावनी मिल गया या जो भी माइक्रोसॉफ्ट विजुअल C++ 2015, लेकिन जीसीसी 5.4.0 से एक चेतावनी से:

"चेतावनी: '0' '% पी' के साथ प्रयोग किया झंडा gnu_printf प्रारूप [-Wformat] "

cppreference printf से पढ़ना, मुझे लगता है कि:

0: पूर्णांक और चल बिन्दु संख्या रूपांतरण, अग्रणी शून्य के लिए पैड के लिए क्षेत्र के बजाय अंतरिक्ष पात्रों में से किया जाता है। पूर्णांक संख्याओं के लिए यदि सटीकता स्पष्ट रूप से निर्दिष्ट की जाती है तो इसे अनदेखा किया जाता है। के लिए इस ध्वज का उपयोग करके अन्य रूपांतरणों को अपरिभाषित व्यवहार में परिणाम मिलता है। यह अनदेखा है अगर - ध्वज मौजूद है।

जहां तक ​​मैं व्याख्या कर सकता हूं,% p सूचक पते के लिए है, जो सभी के बाद एक पूर्णांक संख्या है, तो क्या यह अपरिभाषित व्यवहार% p पर लागू होता है?
यदि नहीं, तो GCC -Wformat चेतावनी क्यों?

+0

oook तो क्यों downvote? – roalz

+0

मुझे लगता है क्योंकि कोड बकवास है जो मौलिक वाक्यविन्यास कारणों के लिए संकलित नहीं होगा? 'printf (" सूचक पता:% 08 पी ", वापसी 0; 'यहां कोड टाइप न करें, बजाय वास्तविक कोड या एक कार्य उदाहरण कॉपी/पेस्ट करें। – Lundin

+0

जेज़, ठीक है, मैंने अभी पाया है कि आइडिया से कॉपी और पेस्ट काम नहीं करता है जैसा कि मैंने उम्मीद की, संपादित किया। – roalz

उत्तर

5

%p सूचक पता है, जो सभी

हालांकि संकेत संख्यात्मक प्रस्तुति है, मानक पर विचार नहीं करता संकेत दिए गए एक अभिन्न डेटा प्रकार के बाद एक पूर्णांक संख्या है के लिए है। इसलिए, %08p प्रारूप का उपयोग अपरिभाषित व्यवहार का कारण बनता है।

आप using uintptr_t data type द्वारा इस समस्या को हल कर सकते हैं एक अहस्ताक्षरित पूर्णांक के रूप में यह करने के लिए अपने सूचक को परिवर्तित करने, और फिर उसे प्रिंट:,

#include <cinttypes> 
#include <cstdint> 

int main() { 
    int i = 123; 
    void* p = &i; 
    printf("%08" PRIxPTR "\n", (uintptr_t)p); 
    return 0; 
} 

Demo.

4

% p सूचक पता है, जो सभी के बाद एक पूर्णांक संख्या है के लिए है,

नहीं, एक सूचक देखने का C/C++ प्रकार प्रणाली बिंदु से एक पूर्णांक नहीं है।

पॉइंटर्स न तो अंकगणित हैं और न ही अभिन्न प्रकार हैं, पेडेंटिक होने के लिए, std::is_integral, std::is_arithmetic देखें।

संबंधित मुद्दे