Неправильное использование указателя вызывает ошибку сегментации. Я все еще не уверен, как это исправить - PullRequest
1 голос
/ 30 мая 2020

Прочитав, я чувствую, что понимаю, что здесь не так, но не знаю, как это исправить. Насколько я понимаю, проблема заключается в том, как я написал ввод массива в строке 4 (подчеркнуто). Сама проблема заключается в том, что когда я запускаю код в первый раз в любой среде IDE, он работает нормально, но затем, когда я пытаюсь поиграть с числами, он обрабатывает новый массив так, как если бы он делит размер с первым, даже если это не так. Похоже, мне следует переписать строку 4 каким-то другим способом, чтобы не злоупотреблять указателем, но я не уверен, как это сделать.

using namespace std;

void INSERTIONSORT(int* A) { //THIS IS LINE 4
    int i;
    int key;
    for (int j = 0; j < sizeof(A); j++) {
        key = A[j];
        i = j - 1;
        while (i >= 0 && A[i] > key) {
            A[i + 1] = A[i];
            i = i - 1;
        }
        A[i + 1] = key;
    }
}

void display(int* A) {
    for (int i = 0; i <= sizeof(A)-1; i++)
        cout << A[i] << " ";
    cout << endl;
}

int main() {
    int myArray[] = { 2,1,4,3 };
    cout << "Array before Sorting: ";
    display(myArray);
    INSERTIONSORT(myArray);
    cout << "Array after Sorting: ";
    display(myArray);
    return 0;
}```

1 Ответ

1 голос
/ 30 мая 2020

Проблема в этой строке:

for (int j = 0; j < sizeof(A); j++) {

вам нужен размер вашего массива (количество элементов), вы получите размер вашего указателя в байтах (= 4, для 32-битные системы), как правило, вы хотите явно передать размер массива или использовать какой-то контейнер (std::vector), который знает свой размер.

...