Подтвердить что ты не робот

Ошибка шины: ошибка 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;
}

Он компилируется просто отлично без каких-либо предупреждений или ошибок, но когда я запускаю приложение, я получаю эту ошибку

Bus error: 10

Чего я скучаю?

4b9b3361

Ответ 1

Во-первых, вы не можете изменять строковые литералы. Это поведение undefined.

Чтобы исправить это, вы можете сделать str локальный массив:

char str[] = "First string";

Теперь у вас будет вторая проблема, это то, что str недостаточно велик, чтобы удерживать str2. Поэтому вам нужно будет увеличить его длину. В противном случае вы превысите str - это также поведение undefined.

Чтобы обойти эту вторую проблему, вам нужно либо сделать 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);

Есть и другие более элегантные способы сделать это с использованием VLA (на C99) и распределения стека, но я не буду вдаваться в них, поскольку их использование несколько сомнительно.


Как отметил @SangeethSaravanaraj в комментариях, все пропустили #import. Он должен быть #include:

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

Ответ 2

Для строк нет места. используйте указатели массива (или) с malloc() и free()

Кроме этого

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

должен быть

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

ПРИМЕЧАНИЕ:

  • все, что есть malloc() ed должно быть free() 'ed
  • вам нужно выделить n + 1 байты для строки длиной n (последний байт для \0)

Пожалуйста, введите следующий код в качестве ссылки

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

Ответ 3

str2 указывает на статически назначенный массив символов констант. Вы не можете писать ему/над ним. Вам необходимо динамически выделять пространство через семейство функций *alloc.

Ответ 4

Ваш код пытается перезаписать строковый литерал. Это поведение undefined.

Есть несколько способов исправить это:

  • используйте malloc(), затем strcpy(), затем free();
  • превратите str в массив и используйте strcpy();
  • используйте strdup().

Ответ 5

это потому, что str указывает на строковый литерал, это константная строка... но вы пытаетесь изменить ее путем копирования. Примечание: если бы это было ошибкой из-за распределения памяти, ему была бы дана ошибка сегментации во время выполнения. Но эта ошибка возникает из-за постоянной модификации строки, или вы можете перейти через ниже для более подробной информации об ошибке шины:

Ошибки шины в настоящее время редки на x86 и происходят, когда ваш процессор не может даже попытаться запросить доступ к памяти, как правило:

  • с использованием инструкции процессора с адресом, который не удовлетворяет его требования к выравниванию.

При доступе к памяти, которая не принадлежит вашему процессу, возникают сбои сегментации, они очень распространены и обычно являются результатом:

  • с помощью указателя на то, что было освобождено.
  • используя неинициализированный, следовательно, фиктивный указатель.
  • с использованием нулевого указателя.
  • переполнение буфера.

Чтобы быть более точным, это не манипулирует самим указателем, который вызовет проблемы, он обращается к памяти, на которую он указывает (разыменование).

Ответ 6

Строковые литералы

не изменяются в C

Ответ 7

Всякий раз, когда вы используете переменные указателя (астерикс), такие как

char *str = "First string";

вам нужно присвоить ему память

str = malloc(strlen(*str))