Saturday, 15 March 2014

c - struct assignment: segment fault 11 -


<पूर्व> #include & lt; stdio.h & gt; #include & lt; string.h & gt; # शामिल करें & lt; stdlib.h & gt; संघ मूल्य {लंबे समय तक मैं; अहस्ताक्षरित लंबे समय तक यू; डबल डी; लंबे समय तक एलडी; शून्य * पी; शून्य (* जी) (); }; Struct foo {struct {यूनियन मूल्य अधिकतम; संघ मूल्य न्यूनतम; } सीमा; }; Struct bucket_info {void * p; // मुक्त स्थिति शून्य * सीमा; // अंत स्थिति संरचना bucket_info * अगला; // अगला बाल्टी}; # परिभाषित नोड्स 8192 शून्य * my_malloc (size_t आकार) {शून्य * p = malloc (आकार); अगर (! पी) बाहर निकलें (1); मेम्सेट (पी, 0, आकार); वापसी पी; } शून्य * alloc_bucket (size_t आकार) {struct bucket_info * pb; Pb = my_malloc (sizeof (struct bucket_info) + आकार); Pb- & gt; p = pb + 1; Pb- & gt; सीमा = (चार *) pb- & gt; p + आकार; वापसी पीबी; } शून्य * alloc_for_size (संरचना bucket_info * s, size_t आकार) {शून्य * ret; जबकि (s- & gt; अगला) s = s- & gt; अगला; अगर ((चार *) एस- & gt; पी + आकार & gt; (चार *) एस- & gt; सीमा) {struct bucket_info * pb = alloc_bucket (आकार * नोड्स); S- & gt; अगला = pb; S = pb; } रेट = s- & gt; p; S- & gt; p = (char *) s- & gt; p + आकार; रिटर्न रिट; } स्थिर शून्य * alloc_node (struct bucket_info ** s, size_t आकार) {if (! * S) * s = alloc_bucket (size * nodes); वापसी alloc_for_size (* एस, आकार); } स्थिर संरचना bucket_info * foo_info; शून्य * alloc_foo_node () {void * ret = alloc_node (& amp; foo_info, sizeof (struct foo)); रिटर्न रिट; } Struct foo * new_foo () {return alloc_foo_node (); } शून्य परीक्षण (एट टी, स्ट्रेट foo * foo1) {struct foo * foo2 = new_foo (); // इस लाइन पर क्रैश * foo2 = * foo1; // इस स्विच कथन पर टिप्पणी करें, यह काम करता है क्यूं कर? स्विच (टी) {मामला 1: तोड़; डिफ़ॉल्ट: ब्रेक; }} Int main (int argc, const char * argv []) {struct foo * foo1 = new_foo (); परीक्षण (10, फू 1); वापसी 0; }

ऊपर पूरे कोड है। और मैंने इसे क्लैंग के साथ संकलित किया है, लाइन पर 'सेगमेंट फॉल्ट 11' मिला:

  * foo2 = * foo1;  

फिर, इस लाइन को इस पर बदलें:

  memcpy (foo2, foo1, sizeof (struct Foo));  

यह काम करता है

फिर मैंने इन दो मामलों को जीसीसी के साथ संकलित करने की कोशिश की है, कोई समस्या नहीं है।

alloc_foo_node द्वारा दिया जाने वाला मान struct foo के लिए सही ढंग से गठबंधन नहीं हो सकता है।

मेरे सिस्टम पर, मुद्रण _Alignof (struct foo) देता है 16 , लेकिन संकेतक foo1 और foo2 16 के गुणक नहीं हैं।

इसलिए यह अपरिभाषित व्यवहार का कारण बनता है alloc_foo_node के प्रकार के < फू * । ।

इसे ठीक करने के लिए आपको अपने आवंटन कोड के साथ बहुत अधिक घूमना पड़ेगा, यह सुनिश्चित करने के लिए कि यह केवल उस स्थान को बाहर करता है जो कि Struct foo आप इसके साथ मदद करने के लिए max_align_t का उपयोग कर सकते हैं (इसे परिभाषित किया जाता है ताकि _Alignof (max_align_t) सबसे बड़ा संभव संरेखण आवश्यक है)।


No comments:

Post a Comment