2013-05-17 25 views
6

से पूर्णांक सरणी लौटें मैं एक फ़ंक्शन से पूर्णांक की एक सरणी वापस करने की कोशिश कर रहा हूं, संख्याओं को क्रमबद्ध करें और फिर सबकुछ वापस मुख्य पर पास करें। मैंने इस कोड के टुकड़े में स्मृति आवंटित और मुक्त नहीं किया है। मैं बस यह देखने की कोशिश कर रहा था कि यह वास्तव में काम करेगा या नहीं। संकलक b=sort(a) कथन के लिए एक त्रुटि झंडे। यह कहता है कि यह असाइन करने योग्य नहीं है, जो समझ में आता है। इनपुट पूर्णांक पॉइंटर्स नहीं हैं। क्या पॉइंटर्स के रूप में पूर्णांक की सरणी घोषित करने का कोई तरीका है? जैसे:फ़ंक्शन

int *a[5]={3,4}

#include <stdio.h> 
#include <stdlib.h> 
int *sort(int *input_array); 

int *sort(int *input_array) 
{ 
    return input_array; 
} 

int main() 
{ 
    int a[5]={3,4}; 
    int b[5]; 
    b=sort(a); 
    return 0; 
} 
+1

संभावित डुप्लिकेट [सी का उपयोग कर एक सरणी लौटाना] (http://stackoverflow.com/questions/11656532/returning-an-array-using-c) –

उत्तर

10

जब आप कोई सरणी बनाते हैं, तो आप सरणी को केवल असाइन नहीं कर सकते (केवल तत्वों के लिए)। इसके अलावा, जब आप एक सरणी पास करते हैं, तो आप इसे संदर्भ से गुजर रहे हैं, sort() सरणी को संशोधित करेगा, जिससे इसे वापस करने के लिए इसे अनदेखा कर दिया जाएगा।

के दोनों क्या आप के लिए देख रहे हैं: मूल सरणी, जो इस तरह होगा छँटाई:

void sort (int * array); 

void sort (int * array) { 
    // do stuff on the array 
} 

int main (void) { 
    int a[5] = {1, 46, 52, -2, 33}; 
    sort(a); // result is still in a 
    return 0; 
} 

या एक प्रति बनाकर और उसे छँटाई, इस तरह होगा जो:

#include <stdlib.h> 
#include <string.h> 
int * sort (int * array, unsigned size); 

int * sort (int * array, unsigned size) { 
    int * copy = malloc(sizeof(int) * size); 
    memcpy(copy, array, size * sizeof(int)); 
    // sort it somehow 
    return copy; 
} 

int main (void) { 
    int a[5] = {1, 46, 52, -2, 33}; 
    int * b; // pointer because I need to assign to the pointer itself 
    b = sort(a, (sizeof a)/(sizeof *a)); // now result is in b, a is unchanged 
    // do something with b 
    free(b); // you have to 
    return 0; 
} 
5

आप सरणियों असाइन नहीं कर सकते, वे "प्रथम श्रेणी नागरिकों" नहीं कर रहे हैं, लेकिन इसके बजाय ज्यादा संकेत की तरह व्यवहार करते हैं।

आप की तरह कुछ की जरूरत है:

int a[] = { 3, 4 }; 
int *b; 

b = sort(a, sizeof a/sizeof *a); 

sizeof अभिव्यक्ति सरणी की लंबाई की गणना करने की जरूरत है, sort() समारोह है कि निर्धारित नहीं कर सकता नंगे सूचक इसे पारित हो जाता है से।

अद्यतन: ऊपर मानता है कि आप इनपुट सरणी बदलते नहीं किया जाएगा, लेकिन यदि आप तो (के रूप में, धन्यवाद एक टिप्पणी में कहा) वापसी मान फोन करने वाले के बाद से की जरूरत नहीं निश्चित रूप से है a बदल जाएगा जब sort() कॉल रिटर्न।

+1

यह कहा गया है, यह एक जगह है, तो आप बी की भी आवश्यकता नहीं है। एक कॉल के बाद बस क्रमबद्ध है। – xaxxon

1

यदि आप सरणी पास कर रहे हैं - int का सूचक, आपको एक बदली गई सरणी वापस करने की आवश्यकता नहीं है। आपके द्वारा पारित सरणी बदल जाएगी।

जैसा कि @unwind ने सुझाव दिया है, आपको फ़ंक्शन में तत्वों की संख्या भी पास करनी चाहिए ताकि फ़ंक्शन को पता चल सके कि सरणी में कितने तत्व हैं।

+0

तो चरित्र सरणी संशोधित नहीं होनी चाहिए? या वे करते हैं .. बस परिवर्तनीय लंबाई वर्ण सरणी नहीं है? – seasick

+0

@seasick, क्षमा करें आपको नहीं मिला। – Rohan

1

आप सी में किसी भी चीज को वापस नहीं कर सकते हैं। आप केवल एक डेटाटाइप का एक ही उदाहरण वापस कर सकते हैं।

वह डेटाटाइप संख्याओं (या किसी और चीज) की अनुक्रमिक सूची संग्रहीत करने के लिए एक सूचक हो सकता है, लेकिन परिणाम के बारे में सारी जानकारी खो जाती है, इसलिए आपको या तो यह जानने की ज़रूरत है, या आपको दूसरा होना है आपको लंबाई बताए जाने के लिए आउटपुट वैरिएबल के रूप में मूल्य।

आप एक कस्टम डेटाटाइप भी वापस कर सकते हैं, जैसे एक संरचना, जिसमें डेटा की लंबाई और लंबाई दोनों की सूची होगी। हालांकि, एक बड़े डेटास्ट्रक्चर को वापस करने से डेटा संरचना की कई उथली प्रतियां बनती हैं, आपके प्रोग्राम के निष्पादन को धीमा कर दिया जाता है और साथ ही लीक और कई संदर्भों के साथ मेमोरी दुःस्वप्न बनाते हैं।

कस्टम डेटा संरचना में पॉइंटर लौटने पर, बहुत अच्छी तरह से काम कर सकते हैं।