#include <iostream>
using namespace std;
class Empty{
char omg[0];
};
int main()
{
Empty em1, em2;
Empty set[100];
cout << sizeof(Empty) << " " << sizeof(em1) << " " << sizeof(em2) << endl;
cout << (long*)&em1 << " " << (long*)&em2 << endl;
cout << "total numbers of element is: " << sizeof(set)/sizeof(*set) << endl;
return 0;
}
इसका उत्पादन होता है:कुछ
0xbff36ad0 0xbff36ac8
तत्वों की संख्या है: 4
परिणाम हैं बहुत आश्चर्यजनक
ऊपर दिखाए गए अनुसार, खाली एक वर्ग है, इसका आकार और इसकी वस्तुएं सभी 0 हैं, क्यों?
शायद मुझे लगता है, क्योंकि एक खाली वर्ग का आकार 1 है, और जब कक्षा खाली नहीं है, तो इसका आकार सदस्यों द्वारा तय किया जाता है, लेकिन यहां इसका सदस्य विशेष है, यह लंबाई शून्य की सरणी है, और यह सरणी आकार 0 है, इसलिए वर्ग और वस्तुओं का आकार सभी 0
यह मेरा अनुमान है। कार्यक्रम चलने के रूप में, हम देख सकते हैं कि दोनों वस्तुओं में पता है, और पता अलग है।
यहां मेरा प्रश्न है: यदि 0 आकार का ऑब्जेक्ट लागू किया जा सकता है, तो सी ++ मानक कहता है कि खाली वस्तुओं का आकार() = 1 है, यह "यह सुनिश्चित करने के लिए है कि दो अलग-अलग वस्तुओं के पते अलग होंगे" Why is the size of an empty class not zero?, लेकिन अब, हमारे पास उत्पादन के रूप में अलग पता है, यह कैसे होता है?
और भी, कोई फर्क नहीं पड़ता कि सरणी सेट का आकार क्या है, आखिरी लाइन आउटपुट हमेशा 4 है, क्यों?
धन्यवाद :)
पुनश्च: मैं MacOS पर इस कार्यक्रम चलाने के लिए, और संकलक एप्पल LLVM संस्करण 5.1 (बजना-503.0.40) (LLVM 3.4svn के आधार पर)
शून्य आकार के सरणी गैर मानक हैं (वास्तव में मानक स्पष्ट रूप से उन्हें मना करता है), इसलिए मानक के बारे में आपका प्रश्न मंथन है। आकार के लिए, यदि आपका कंपाइलर 'आकार (खाली) == 0' मानता है तो आप शून्य से विभाजित होते हैं, जो अपरिभाषित व्यवहार है। – user657267
एफडब्ल्यूआईडब्ल्यू; msvc आउटपुट 'त्रुटि C2233:' set ': शून्य-आकार वाले सरणी वाले ऑब्जेक्ट्स के सरणी अवैध हैं – Niall
आप शून्य आकार के सरणी (एक्सटेंशन) और डाइविंग शून्य से –