2009-03-04 10 views
11

मैंने बफर को आकार 100 पर सेट किया है। मैं बफर को मुख्य समारोह में प्रदर्शित करता हूं जहां बफर घोषित किया जाता है। हालांकि, जब मैं फ़ंक्शन में बफर पास करता हूं और '4', का आकार प्राप्त करता हूं, तो मुझे लगता है कि यह 100 होना चाहिए, क्योंकि यह बफर का आकार है जो Iमुख्य में बनाया गया है। उत्पादन: बफर आकार: 100 sizeof (बफर): 4फ़ंक्शन के लिए चार बफर पास करने और बफर के आकार को प्राप्त करने के लिए

#include <string.h> 
#include <stdio.h> 

void load_buffer(char *buffer); 

int main() 
{ 
    char buffer[100]; 
    printf("buffer size: %d\n", sizeof(buffer)); 
    load_buffer(buffer); 

    return 0; 
} 

void load_buffer(char *buffer) 
{ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 
+2

मुख्य में() आपने स्पष्ट रूप से एक सरणी घोषित की है, जबकि load_buffer() में आपने एक सूचक घोषित किया है। अंतर मुख्य रूप से() में संकलक जानता है कि बफर एक सरणी है, लेकिन load_buffer() में संकलक यह नहीं जानता कि बफर किसी सरणी से है या ढेर में स्मृति की आवंटित शांति, या संरचना या जो भी हो । कंपाइलर केवल मेमोरी एड्रेस (इस प्रकार एक पॉइंटर) जानता है, इसलिए आकार() मेमोरी एड्रेस का आकार देता है, जो कि 4 बाइट लंबा है (क्योंकि यह 32 बिट मशीन है, अगर यह 64 बिट्स मशीन थी, तो यह 8 होगा लंबे बाइट्स)। उम्मीद है कि यह थोड़ा और समझने में मदद करता है। – AndaluZ

+0

आकार() फ़ंक्शन के बजाय, strlen() का उपयोग करें, फिर यह सूचक मूल्य का आकार देता है। – NandhaKumar

उत्तर

19

आप बफर (4 बाइट्स) के सूचक के आकार का उपयोग कर रहे हैं, बल्कि बफर के आकार की तुलना में।

सी में, आपको बफर के आकार को अलग से पास करना होगा, जो कारण बफर ओवररन्स इतनी आसानी से और अक्सर होता है।

void load_buffer(char * buffer, size_t bufSize) 
{  
    ... 
} 
4

क्या होता है, जब आप एक समारोह के लिए एक सरणी गुजरती हैं, आप केवल सरणी के पते याद में, सरणी के नहीं आकार पार जाते हैं। Load_buffer() में क्या आकार (बफर) आउटपुट हो रहा है पॉइंटर का आकार है, जो चार बाइट्स है। करने के लिए

void load_buffer(char *buffer, int length); 

और कॉल:

load_buffer(buffer, sizeof(buffer)); 

और फिर लंबाई का उपयोग आप जब चाहें

समारोह में बफर के आकार रखने के लिए सबसे अच्छा तरीका है करने के लिए समारोह को बदलने के लिए है बफर का आकार।

8

ओपी से

void load_buffer(char *buffer) 
{ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 

भले ही आप कल्पना कर सकते हैं कि load_buffer() refrence द्वारा buffer पारित हो जाता है, क्या वास्तव में हो रहा है आप मूल्य द्वारा char के लिए सूचक गुजर रहे है। वास्तविक सरणी पारित नहीं किया जाता है तो वहाँ load_buffer() समारोह के लिए कोई रास्ता नहीं है बफर सरणी

तो क्या sizeof(buffer) कर रहा है के आकार का पता करने के लिए है? यह बस एक सूचक के आकार को चार में वापस कर रहा है। यदि load_buffer() को buffer के आकार की आवश्यकता है तो इसे अलग से पारित करने की आवश्यकता है।

या आप कि बजाय struct के लिए एक नया struct है कि दोनों एक चार सरणी और सरणी के आकार में शामिल है एक सूचक बना सकते हैं और गुजरती हैं, कि जिस तरह से बफर और यह के आकार एक साथ हमेशा से रहे हैं;)

20

मिच गेहूं और हफेज़ द्वारा जवाब पूरी तरह से सही और बिंदु पर हैं। मैं कुछ अतिरिक्त जानकारी दिखाने जा रहा हूं जो कभी-कभी उपयोगी साबित हो सकता है।

नोट है कि एक ही होता है अगर आप संकलक बताओ कि आप सही आकार

void load_buffer(char buffer[100]) { 
    /* prints 4 too! */ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 

पैरामीटर के रूप में एक सरणी सिर्फ एक सूचक की घोषणा कर रहा है की एक सरणी है। संकलक स्वचालित रूप से char *name में बदल जाता है भले ही इसे char name[N] के रूप में घोषित किया गया हो।

आप केवल 100 आकार की एक सरणी पारित करने के लिए कॉल करने के लिए मजबूर करना चाहते हैं, तो आप सरणी के पते (और उस के प्रकार) के बजाय स्वीकार कर सकते हैं:

void load_buffer(char (*buffer)[100]) { 
    /* prints 100 */ 
    printf("sizeof(buffer): %d\n", sizeof(*buffer)); 
} 

यह सरणी आप के लिए एक सूचक है मुख्य में है, इसलिए आपको सरणी प्राप्त करने के लिए फ़ंक्शन में अव्यवस्था की आवश्यकता है। अनुक्रमण तो, द्वारा

buffer[0][N] or (*buffer)[N] 

कोई भी मुझे पता है कि क्या कर रहा है और मैं न तो इसे अपने आप को कर रहा हूँ किया है क्योंकि यह बजाय तर्क के निधन पेचीदा हो गया है। लेकिन इसके बारे में जानना अच्छा है। आप इस तो

load_buffer(&buffer) 

की तरह समारोह कॉल कर सकते हैं आप भी अन्य आकारों को स्वीकार करना चाहते हैं, मैं गुजर-एन विकल्प अन्य दो जवाब की सिफारिश के साथ जाना होगा।

+1

+1 थोड़ा अतिरिक्त प्रयास करने के लिए – Tom