Was bedeutet Bus: Fehler 10 in C

Lesezeit: 4 Minuten

Benutzeravatar von summerc
sommerc

Unten ist mein Code

#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;
}

Es lässt sich problemlos ohne Warnungen oder Fehler kompilieren, aber wenn ich den Code ausführe, erhalte ich den folgenden Fehler

Bus error: 10

Was habe ich verpasst ?

  • Brunnen, strlen(str)<strlen(str2).

    Benutzer554546

    3. Januar 2012 um 18:11 Uhr

  • Vermisst jeder das #import?!!

    – Sangeeth Saravanaraj

    3. Januar 2012 um 18:18 Uhr

  • @SangeethSaravanaraj Ja, ich kann es selbst nicht glauben. lol Alle haben es vermisst…

    – Mystisch

    3. Januar 2012 um 18:24 Uhr

  • Auch const char *argv[] was in einer gehosteten Umgebung nicht gültig ist. Du solltest benutzen char *argv[]

    – au

    3. Januar 2012 um 18:25 Uhr

Benutzeravatar von Mystical
Mystisch

Zum einen können Sie Zeichenfolgenliterale nicht ändern. Es ist undefiniertes Verhalten.

Um das zu beheben, können Sie machen str ein lokales Array:

char str[] = "First string";

Nun, Sie werden ein zweites Problem haben, ist das str ist nicht groß genug, um zu halten str2. Sie müssen also die Länge erhöhen. Andernfalls werden Sie überrannt str – was auch undefiniertes Verhalten ist.

Um dieses zweite Problem zu umgehen, müssen Sie entweder machen str mindestens solange str2. Oder dynamisch zuweisen:

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);

Es gibt andere elegantere Möglichkeiten, dies zu tun, einschließlich VLAs (in C99) und Stack-Zuweisung, aber ich werde nicht darauf eingehen, da ihre Verwendung etwas fragwürdig ist.


Wie @SangeethSaravanaraj in den Kommentaren betonte, haben alle das verpasst #import. Es sollte sein #include:

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

  • Mystisch, #import wird in C sowohl für Clang als auch für GCC unterstützt und ist eine Objective-C-Erweiterung. Es gibt kein Problem mit dem OP-Code, da er nur automatische Include-Wächter hinzufügt und sonst nichts.

    – Richard J.Ross III

    29. Januar 2013 um 1:33 Uhr

  • Dass ist mystisch.

    – Samie Bencherif

    31. Dezember 2018 um 15:08 Uhr

Benutzeravatar von Sangeeth Saravanaraj
Sangeeth Saravanaraj

Den Zeichenfolgen wird kein Platz zugewiesen. Verwenden Sie Array- (oder) Zeiger mit malloc() und free()

Abgesehen davon

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

sollte sein

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

HINWEIS:

  • alles was ist malloc()ed muss sein free()‘ed
  • Sie müssen zuordnen n + 1 Bytes für eine Zeichenfolge, die eine Länge hat n (Das letzte Byte ist für \0)

Bitte verwenden Sie den folgenden Code als Referenz

#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;
}

str2 zeigt auf ein statisch zugewiesenes konstantes Zeichenarray. Sie können nicht darauf/darüber schreiben. Sie müssen Speicherplatz dynamisch über die zuweisen *alloc Familie von Funktionen.

Zeichenfolgenliterale sind in C nicht änderbar

Ihr Code versucht, ein Zeichenfolgenliteral zu überschreiben. Dies ist ein undefiniertes Verhalten.

Es gibt mehrere Möglichkeiten, dies zu beheben:

  1. verwenden malloc() dann strcpy() dann free();
  2. drehen str in ein Array und verwenden strcpy();
  3. verwenden strdup().

Benutzeravatar von DumbCoder
DumbCoder

Dies liegt daran, dass str auf eine Zeichenfolge zeigt. Literal bedeutet eine konstante Zeichenfolge … aber Sie versuchen, sie durch Kopieren zu ändern. Hinweis: Wenn es sich um einen Fehler aufgrund der Speicherzuweisung gehandelt hätte, wäre zur Laufzeit ein Segmentierungsfehler aufgetreten. Dieser Fehler tritt jedoch aufgrund einer ständigen Zeichenfolgenänderung auf, oder Sie können die folgenden Schritte durchgehen, um weitere Informationen zum Busfehler zu erhalten:

Busfehler sind heutzutage auf x86 selten und treten auf, wenn Ihr Prozessor den angeforderten Speicherzugriff nicht einmal versuchen kann, typischerweise:

  • Verwenden einer Prozessoranweisung mit einer Adresse, die ihre Ausrichtungsanforderungen nicht erfüllt.

Segmentierungsfehler treten auf, wenn auf Speicher zugegriffen wird, der nicht zu Ihrem Prozess gehört. Sie treten sehr häufig auf und sind normalerweise das Ergebnis von:

  • Verwenden eines Zeigers auf etwas, das freigegeben wurde.
  • Verwenden eines nicht initialisierten, daher falschen Zeigers.
  • mit einem Nullzeiger.
  • Überlaufen eines Puffers.

Genauer gesagt wird nicht der Zeiger selbst manipuliert, der Probleme verursacht, sondern auf den Speicher zugegriffen, auf den er zeigt (Dereferenzierung).

Benutzeravatar von Vlad Rusu
Vlad Russu

Lassen Sie mich erklären, warum Sie diesen Fehler “Bus error: 10” erhalten haben

char *str1 = "First string";
// for this statement the memory will be allocated into the CODE/TEXT segment which is READ-ONLY

char *str2 = "Second string";
// for this statement the memory will be allocated into the CODE/TEXT segment which is READ-ONLY

strcpy(str1, str2);
// This function will copy the content from str2 into str1, this is not possible because you are try to perform READ WRITE operation inside the READ-ONLY segment.Which was the root cause 

Wenn Sie eine Zeichenfolgenmanipulation durchführen möchten, verwenden Sie automatische Variablen (STACK-Segment) oder dynamische Variablen (HEAP-Segment).

Vasanth

1407140cookie-checkWas bedeutet Bus: Fehler 10 in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy