Создать новый символ * из 1, заданного в качестве аргумента, с элементами между 2 индексами

#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 метод и избавить себя от множества головных болей.