2009-12-14 12 views
26

सी में, मैं structs की एक सरणी परिभाषित की तरह है:सी में structs की सरणी पर 'sizeof' के परिणाम?

struct D 
{ 
    char *a; 
    char *b; 
    char *c; 
}; 

static struct D a[] = { 
    { 
     "1a", 
     "1b", 
     "1c" 
    }, 
    { 
     "2a", 
     "2b", 
     "2c" 
    } 
}; 

मैं सरणी में तत्वों की संख्या निर्धारित करने के लिए चाहते हैं, लेकिन एक गलत परिणाम sizeof(a) रिटर्न: 48, नहीं 2. एम आई कुछ कर रही गलत, या sizeof है बस यहां अविश्वसनीय है? यदि यह मायने रखता है कि मैं GCC 4.4 के साथ संकलित कर रहा हूं।

+0

देखें http://stackoverflow.com/questions/1598773/is-there-a- मानक- कार्यक्षमता-in-c-that-would-return-the-length-of-an-array/1598827#1598827 के लिए एक उत्तर जिसमें तकनीकों को सुरक्षित रूप से नीचे पोस्ट करने के लिए कुछ हैक्स शामिल हैं। –

उत्तर

27
sizeof a/sizeof a[0]; 

यह एक संकलन समय स्थिर है ताकि आप इसे उपयोग कर सकते हैं, उदाहरण के लिए, एक और सारिणी निर्मित:

#define N sizeof a/sizeof a[0] 
int n_a[N]; 
+0

इस मामले में, यदि आकार (ए) 48 है, आकार (एक [0]) == 24. यह प्रत्येक char * 8 बाइट्स लेता है। आकार (char *) शायद 32-बिट/64-बिट के आधार पर 4 या 8 है, लेकिन कंपाइलर्स स्ट्रक्चर सदस्यों को संरेखित करेंगे, इसलिए प्रत्येक तत्व 8 बाइट्स लेता है। – jmanning2k

+1

हां, लेकिन अच्छी बात यह है कि विभाजन सही आकार देता है चाहे पैडिंग है या नहीं, या जो भी 'संरचना' का आकार हो। –

+0

# परिभाषा के अंत में अर्धविराम नहीं होना चाहिए – Paamand

37

sizeof आप बाइट में आकार, नहीं तत्वों की संख्या देता। जैसा कि आलोक कहते हैं, तत्वों की संख्या प्राप्त करने के लिए, आकार को एक तत्व के बाइट्स में आकार के अनुसार सरणी के बाइट्स में विभाजित करें। सही सी मुहावरा है:

sizeof a/sizeof a[0] 
+7

+1। –

+10

एक वैकल्पिक, बस-जैसा-मूर्ख संस्करण 'आकार/आकार का * आकार है – caf

7

sizeof पारित कर दिया तत्व की स्मृति में आकार देता है। एक तत्व के आकार से सरणी के आकार को विभाजित करके, आप तत्वों को गिनते हैं।

ध्यान दें कि तत्व आकार में कुछ पैडिंग बाइट भी शामिल हो सकते हैं। इस कारण से, एक गद्दीदार संरचना (उदाहरण के लिए जब एक char सदस्य एक सूचक द्वारा पीछा किया जाता है) में सदस्यों के आकार की तुलना में sizeof मूल्य अधिक होगा।

दूसरी ओर, किसी सरणी में तत्वों की गणना करते समय इसे परेशान न करें: sizeof(a)/sizeof(a[0]) अभी भी अपेक्षा के अनुसार चिकनी काम करेगा।