मुझे पता है कि सी मानक कार्यान्वयन जहांरियल कार्यान्वयन जहां sizeof (size_t) <sizeof (अहस्ताक्षरित int)
(sizeof(unsigned) > sizeof(size_t))
या
(sizeof(int) > sizeof(ptrdiff_t))
सच है के लिए अनुमति देता है। लेकिन क्या कोई वास्तविक कार्यान्वयन है जहां इनमें से एक सच है?
पृष्ठभूमि
मैं asprintf()
करने के लिए एक समारोह समान लिखा था (के बाद से asprintf()
पोर्टेबल नहीं है), और snprintf()
एक int
लौट लेकिन एक size_t
तर्क की जरूरत है, तो मैं जाँच करनी चाहिए अगर leni
(नीचे दिखाया गया है) कम नहीं है इस कोड में SIZE_MAX
से अधिक?
va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
//do some error handling
if(leni>=SIZE_MAX) //do i need this part?
//error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
//do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
मुझे यकीन नहीं है कि वास्तव में यह संभव है, अन्यथा 'आकार (char [LARGE_NUMBER]) हमेशा काम नहीं करेगा। –
@ ओलिवर चार्ल्सवर्थ यह सब काम नहीं करता है, अगर आप char str [1024ULL * 1024ULL * 1024ULL * 5] जैसे कुछ लिखते हैं, तो आपको 32 बिट मशीनों पर कम से कम एक संकलन त्रुटि मिलेगी (कम से कम मेरे मामले में gcc -m32 के साथ) (लेकिन नहीं AMD64 पर) – 12431234123412341234123
@ ओलिवर चार्ल्सवर्थ इसे करने की ज़रूरत नहीं है। यदि ब्रैकेट में निरंतर अभिव्यक्ति एक ऑब्जेक्ट बनाती है जिसे size_t द्वारा प्रदर्शित नहीं किया जा सकता है, जो आकार का परिणाम होगा, तो संकलक एक त्रुटि उत्पन्न करेगा। – 2501