2012-01-03 25 views
30

यहाँ जब मैं अनुप्रयोग चलाने मुझे लगता है कि त्रुटिबस त्रुटि: 10 त्रुटि

Bus error: 10 

मैं क्या याद मिलता है मेरी कोड

#import <stdio.h> 
#import <string.h> 

int main(int argc, const char *argv[]) 
{ 
    char *str = "First string"; 
    char *str2 = "Second string"; 

    strcpy(str, str2); 
    return 0; 
} 

यह किसी चेतावनी या त्रुटियों के बिना ठीक संकलित है, लेकिन है?

+1

ठीक है, 'strlen (एसटीआर) की जरूरत है

+29

क्या हर कोई '# import' गायब है? !! –

+4

@ संगीत सरवनराज हां, मैं इसे खुद पर विश्वास नहीं कर सकता। lol हर कोई इसे याद किया ... – Mysticial

उत्तर

34

एक के लिए, आप स्ट्रिंग अक्षर को संशोधित नहीं कर सकते हैं। यह अपरिभाषित व्यवहार है।

ठीक करने के लिए है कि आप str एक स्थानीय सरणी बना सकते हैं:

char str[] = "First string"; 

अब, आप एक दूसरी समस्या है, कि str इतना बड़ा str2 धारण करने के लिए नहीं है। तो आपको इसकी लंबाई बढ़ाने की आवश्यकता होगी। अन्यथा, आप str से अधिक हो जाएंगे - जो कि अपरिभाषित व्यवहार भी है।

इस दूसरी समस्या को पाने के लिए, आपको या तो str कम से कम str2 बनाने की आवश्यकता है। या यह गतिशील रूप से आवंटित:

char *str2 = "Second string"; 
char *str = malloc(strlen(str2) + 1); // Allocate memory 
// Maybe check for NULL. 

strcpy(str, str2); 

// Always remember to free it. 
free(str); 

इस Vlas (C99 में) को शामिल करने के लिए और आवंटन ढेर अन्य अधिक सुरुचिपूर्ण तरीके हैं, लेकिन मैं उन पर नहीं जाऊंगा के रूप में उनके उपयोग को कुछ हद तक संदिग्ध है।


रूप @SangeethSaravanaraj टिप्पणी में कहा, हर कोई #import याद किया। यह #include होना चाहिए:

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

रहस्यमय, '# import' दोनों को क्लैंग और जीसीसी दोनों के लिए सी में समर्थित किया जाना चाहिए, और यह एक उद्देश्य-सी एक्सटेंशन है। ओपी के कोड में कोई समस्या नहीं है, क्योंकि यह केवल स्वचालित रूप से गार्ड को शामिल करता है और कुछ भी नहीं। '# Import' नोटिस करने वाले एकमात्र व्यक्ति होने के लिए –

5

str2 एक स्थिर आवंटित निरंतर चरित्र सरणी को इंगित कर रहा है। आप इसे/इसके बारे में नहीं लिख सकते हैं। आपको *alloc फ़ंक्शन के परिवार के माध्यम से गतिशील रूप से स्थान आवंटित करने की आवश्यकता है।

4

आपका कोड एक स्ट्रिंग शाब्दिक अधिलेखित करने के लिए प्रयास करता है सी में गैर परिवर्तनीय हैं। यह अपरिभाषित व्यवहार है।

इसे ठीक करने के कई तरीके हैं: तो strcpy() तो free()

  1. उपयोग malloc();
  2. str को एक सरणी में बदलें और strcpy() का उपयोग करें;
  3. strdup() का उपयोग करें।
7

तार के लिए आवंटित कोई जगह नहीं है।malloc() और free()

के अलावा के साथ सरणी (या) संकेत का उपयोग करें कि

#import <stdio.h> 
#import <string.h> 

होना चाहिए

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

नोट:

  • कुछ भी है कि malloc() एड free() होना चाहिए ' एड
  • आप एक स्ट्रिंग की लंबाई n की है जिसके लिए n + 1 बाइट्स आवंटित करने के लिए की जरूरत है (पिछले बाइट \0 के लिए है)

कृपया आप क्योंकि str है एक संदर्भ के रूप में निम्नलिखित कोड

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

int main(int argc, char *argv[]) 
{ 
    //char *str1 = "First string"; 
    char *str1 = "First string is a big string"; 
    char *str2 = NULL; 

    if ((str2 = (char *) malloc(sizeof(char) * strlen(str1) + 1)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 

    strcpy(str2, str1); 

    printf("str1 : %s \n", str1); 
    printf("str2 : %s \n", str2); 

    free(str2); 
    return 0; 
} 
+1

+1। – Mysticial

4

इस है एक स्ट्रिंग शब्दकोष को इंगित करना एक निरंतर स्ट्रिंग का मतलब है ... लेकिन आप प्रतिलिपि बनाकर इसे संशोधित करने का प्रयास कर रहे हैं। नोट: यदि स्मृति आवंटन के कारण यह कोई त्रुटि हुई होगी तो इसे रन टाइम पर सेगमेंटेशन गलती दी जाएगी। लेकिन यह त्रुटि निरंतर स्ट्रिंग संशोधन के कारण आ रही है या आप बस त्रुटि त्रुटि के बारे में अधिक जानकारी के लिए नीचे जा सकते हैं:

Bus errors are rare nowadays on x86 and occur when your processor cannot even attempt the memory access requested, typically:

    वाले पते पर अपने संरेखण आवश्यकताओं को पूरा नहीं करता है के साथ एक प्रोसेसर अनुदेश का उपयोग कर

Segmentation faults occur when accessing memory which does not belong to your process, they are very common and are typically the result of:

    कुछ है कि पुनः आवंटित की जाती किया गया था करने के लिए एक सूचक का उपयोग कर
  • एक अनियमित इसलिए बोगस पॉइंटर का उपयोग कर।
  • एक शून्य सूचक का उपयोग कर।
  • एक बफर बह रहा है।

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

1

जब भी आप सूचक चर (asterix) जैसे

char *str = "First string";

आप इसे करने के स्मृति asign को

str = malloc(strlen(*str))

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