Я пишу программу, которая получает массив целых чисел и его логический размер. При вызове он создает новый массив, содержащий только положительные числа из массивов.
Теперь для этого мне нужно написать функцию типа void, принимающую следующие параметры:
(int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePTR)
Я должен использовать указатель int** outPosArrPtr
для обновления базового адреса массива, содержащего положительные числа, и указатель outPosArrSizePtr
для обновления логического размера массива.
теперь, когда я запускаю свой код на компиляторе xcode, логический размер обновляется до очень большого числа. Итак, когда я попытался запустить программу с помощью онлайн-компилятора GDB, я получил ошибку «Ошибка сегментации».
Из прочитанного, что означает ошибка сегментации, я узнал, что это означает, что я пытаюсь получить доступ к памяти, которая «не принадлежит мне», или памяти, которая не находится в стеке вызовов или в части кучи программы.
Я пытался отлаживать свой код, проверяя, ссылаюсь ли я на какие-либо нулевые указатели, или смотрю, ссылаюсь ли я на какие-либо висячие указатели, но, похоже, проблема в другом.
Мой код:
#include <iostream>
typedef int* IntArrPtr;
using namespace std;
int main() {
int arrSize;
int *ptrSize;
ptrSize = &arrSize;
cout << "How many integers will this array hold:\n ";
cin >> arrSize;
IntArrPtr a;
a = new int[arrSize];
fillArr(a, arrSize);
getPosNums4(a, arrSize,&a, ptrSize);
cout << "The new size in main is: " << arrSize << endl;
cout <<"The new array with positive integers is:\n";
/*for(int i =0; i<arrSize;i++) // this runs for a large size of arrSize
cout<< a[i] << " ";
cout<<endl; */
return 0;
}
void fillArr(int a[], int size){
cout << "Please enter " << size << " Integers separated by spaces\n";
cout << "Press enter when finished >\n";
int i;
for (i=0;i<size;i++)
cin >> a[i];
}
void getPosNums4(int* arr, int arrSize, int** outPosArrPtr,int* outPosArrSizePtr){
IntArrPtr newArr;
newArr = new int[arrSize];
int i;
int newIndx = 0;
outPosArrSizePtr = &newIndx;//initiliaze the pointer.
for(i=0;i<arrSize;i++){
if(arr[i] > 0){
newArr[newIndx] =arr[i];
newIndx++;
}
}
arrSize = newIndx;
*outPosArrSizePtr = arrSize;
cout << "The new size is of *outPosArrSizeptr is: " << *outPosArrSizePtr << endl;
for(int j=0;j<newIndx;j++)
outPosArrPtr[j] = &newArr[j];
delete []newArr;
newArr = NULL;
for(int i=0;i<newIndx;i++)
arr[i] = *outPosArrPtr[i];
}
пример Когда я запускаю эту программу на Xcode:
How many integers will this array hold:
6
Please enter 6 Integers separated by spaces
Press enter when finished >
3 -1 -3 0 6 4
The new size is of *outPosArrSizeptr is: 3
The new array with positive integers is:
The new size in main is: 7445512
The program ended with exit code: 0