2016-11-21 2 views
0

Я пытаюсь получить большой массив случайных чисел, а затем передать этот массив в функцию, которая создаст новый массив с 10 элементами, значения которых соответствуют со значениями в большом массиве. Я передаю параметр start в функцию, чтобы указать индекс большого массива, из которого я начну копировать значения в меньший массив.Ошибка сегментации при передаче указателя на массив в функцию (C++)

В случае мое объяснение не понятно, у меня есть массив А из 20 случайно сгенерированных чисел:
A = {1, 2, 3, .... 20}

Я хочу сделать массив B, который содержит первые 10 чисел:
B = {1, 2, 3, .... 10}

и массив C, который содержит второй 10:
C = { 11, 12, 13, .... 20}

Я способен генерировать случайные числа и отображать их для цикла, но как только я начинаю пытаться сделать новые массивы, которые я получаю ошибку сегментации в терминале:
ошибку сегментации (ядро сбрасывали)

Ниже приведен мой код.

int main() { 

    int size = 20; 
    int *arrA = getRandomScores(size); 

    int *arrB = applyScores(arrA, 0); 
    int *arrC = applyScores(arrA, 10); 

    for(int i = 0; i < 10; i++) { 
     cout << arrB[i] << endl; 
    } 
    cout << endl << endl; 
    for(int i = 0; i < 10; i++) { 
     cout << arrC[i] << endl; 
    } 

    return 0; 
} 

int *applyScores(int *arr, int start) { 
    int *newArr; 

    for(int i = 0; i < 10; i++) { 
     newArr[i] = arr[start]; 
     start++; 
    }  

    return newArr; 
} 

int *getRandomScores(int size) { 
    int *arr; 

    //return null if size is zero or negative 
    if (size <= 0) 
     return NULL; 

    //dynamically allocate the array 
    arr = new int[size]; 

    //seed the random number generator 
    srand(time(0)); 

    //populate the array with random numbers 
    for(int i = 0; i < size; i++) 
     arr[i] = rand() % 100; 

    return arr; 
} 

Я на Linux, так что я сказал, чтобы использовать Valgrind, чтобы увидеть более подробное сообщение об ошибке. Вот что мне дал валгринд. Это моя первая встреча с ошибкой сегментации, поэтому простите меня, если ответ тривиален с помощью valgrind.

valgrind error log screenshot

ответ

3

Вы объявляете newArr как указатель на int, но не указывает никуда. Вы можете создать новый массив так:

int *newArr = new int[10]; 

, но не забудьте удалить массив, когда вы сделали с ним:

delete[] arrB; 
delete[] arrC; 

Или вы могли бы просто использовать std::vector<int> для массивов A, B и C (или, по крайней мере, B и C).

+0

Да, это было определенно тривиально. Урок выучен! благодаря! – jreed

1

вы никогда не выделить память для B и C

int *applyScores(int *arr, int start) { 
    int *newArr = new int[10]; 

    for(int i = 0; i < 10; i++) { 
     newArr[i] = arr[start]; 
     start++; 
    }  

    return newArr; 
} 
1

В valgrind при состояниях (использование неинициализированного значения, что означает, что указатель и недействительную запись, что означает запись в котором указатель происходит для обозначения): не выделять память для копирования случайных баллов arrB и arrC. arrNew в applyScores() - это просто указатель, поэтому он не может хранить массив. Самый простой способ избежать подобных проблем - использовать стандартные библиотечные контейнеры, такие как std::vector или std::array, которые делают то, что вы ожидаете, и избегайте ручного управления памятью.

Смежные вопросы