2010-09-15 12 views
11

में प्रारंभ करें, मैं चर के आकार के दो-आयामी सरणी को शून्य में प्रारंभ करना चाहता हूं। मैं जानता हूँ कि यह एक निश्चित आकार सरणी के लिए किया जा सकता है:वैरिएबल आकार की एक बहुआयामी सी सरणी को शून्य

int myarray[10][10] = {0}; 

लेकिन यह काम नहीं कर रहा है, तो मैं यह कर:

int i = 10; 
int j = 10; 
int myarray[i][j] = {0}; 

वहाँ ऐसा करने का एक पंक्ति रास्ता नहीं है या करना मुझे सरणी के प्रत्येक सदस्य पर लूप करना है?

धन्यवाद

उत्तर

9

आप एक प्रारंभकर्ता के साथ प्रारंभ नहीं कर सकते, लेकिन आप के लिए 0.

#include <string.h> 

int main(void) { 
    int a = 13, b = 42; 
    int m[a][b]; 
    memset(m, 0, sizeof m); 
    return 0; 
} 

नोट सरणी memset() कर सकते हैं: इस C99 है।C89 में एम (int m[a][b];) की घोषणा एक त्रुटि है।

+0

@ vittorio88: आप शायद सी ++ कंपाइलर का उपयोग कर रहे हैं। सी में किसी ऑब्जेक्ट के लिए सूचक ('एम 'अकेला, प्रकार' int (*) [बी]' प्रकार) शून्य के लिए एक सूचक के लिए संगत है (टाइप 'शून्य *') जो 'memset()' अपेक्षा करता है। तो वहां कोई समस्या नहीं है। 'C99' में – pmg

-1

चर आकार दो आयामी सरणी सी में समर्थित नहीं हैं एक आयाम (यदि यह पहली या दूसरी है मैं याद नहीं कर सकते) तय किया जाना है। एक बार परिभाषित होने के बाद मैं इसे लूपिंग करने की सलाह देता हूं।

+0

-0.5 (गोलाकार) 'सी 99' परिवर्तनीय आकार दो आयामी सरणी का समर्थन करता है। – pmg

+0

आप सही हैं। मेरी गलती। – erelender

1

यदि आपको अपनी डेटा संरचना में पॉइंटर मिलता है, तो आप memset आज़मा सकते हैं।

+0

+1 - मेमसेट एरे और नई मेमोरी आवंटन शुरू करने का सबसे अच्छा तरीका है, यह निश्चित रूप से सी ++ में काम करता है, इसलिए सी – ChrisBD

+0

@ कब्रिमिंगटन में प्रयास करने योग्य है: अधिकांश संदर्भों में, एक संकेतक को "decays" को पॉइंटर में इसका पहला तत्व यह बहुआयामी सरणी के लिए भी काम करता है और, क्योंकि मेमसेट() एक 'शून्य *' लेता है, पॉइंटर के प्रकार के बारे में कोई समस्या नहीं है, सरणी नाम स्वयं ही दर्शाता है। – pmg

+0

@pmg - धन्यवाद। मैं इसे समझ गया; हालांकि, मैं स्पष्टीकरण की सराहना करता हूं। – kbrimington

0

आप गैर-निरंतर चर का उपयोग करके स्थिर सरणी नहीं बना सकते हैं।

int i = 10; 
int j = 10; 
size_t nbytes = i*j*sizeof(int); 
int* myarray = (int*) malloc(nbytes); 
memset(myarray,0,nbytes); 
+0

-0.5 (गोलाकार) आप ** डीओ ** गैर-निरंतर चर का उपयोग कर स्थैतिक सरणी बना सकते हैं। – pmg

3

Online C99 Standard (n1256 draft), धारा 6.7.8, पैरा 3:

इकाई के प्रकार प्रारंभ करने के लिए अज्ञात आकार या एक वस्तु प्रकार है कि की एक सरणी होगा गतिशील आवंटन उपयोग करने का प्रयास एक परिवर्तनीय लंबाई सरणी प्रकार नहीं।

जोर मेरा।

जैसा कि हर किसी ने कहा है, आपकी सबसे अच्छी शर्त memset() का उपयोग करना है।

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