Ошибка шины: ошибка 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
Чего я скучаю?
Ответы
Ответ 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))