#c
#c
Вопрос:
Я пытаюсь написать функцию для создания нового массива символов из другого, заданного в качестве аргумента, с элементами между 2 указанными индексами.
char * split(char * array, int i, int j){
int x = 0;
char * newArray;
for (int m = i; m < j; m ){
newArray[x] = array[m];
x ;
}
return newArray;
}
Например:
char * s = "helloworld";
char * first = split(s, 0, 5); // 'hello'
char * second = split(s, 5, 10); // 'world'
Но по какой-то причине он продолжает выдавать мне ошибку сегментации после того, как я пытаюсь получить доступ к любому из элементов ‘first’ или ‘second’ после вызова функции.
Комментарии:
1.
char * newArray;
это указатель. Он неинициализирован. За ним нет памяти.newArray[x] =
недопустимо. Где вы хотите сохранить байты, которые находятся в строке?
Ответ №1:
Вы никогда не выделяли фактическую память для char * newArray
(или даже инициализировали ее NULL
или тому подобное), поэтому это мусорный адрес, указывающий на нераспределенную память.
В первый раз, когда вы это делаете, newArray[x] = array[m];
вы вызвали неопределенное поведение; newArray
указывает на ??? и newArray[x]
указывает на « x
прошедшие байты ???», который все еще ???. Вам нужно самостоятельно выделить память и сохранить указатель на нее в newArray
(выделить дополнительный байт для NUL
терминатора), инициализировать его путем копирования (и убедитесь, что вы установили NUL
байт в конце для строк в стиле C) и вернуть его.
Обратите внимание, что, учитывая, что вы используете C , вам действительно следует просто использовать std::string
и его substr
метод и избавить себя от множества головных болей.