Почему я получаю эту ошибку ошибки сегментации? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь использовать этот код для определения координат массивов определенным образом, но я всегда получаю ошибку сегментации в строке 25, но я не понимаю, почему.

#include <stdio.h> 
#include <stdlib.h>

void bq(int* v, int s, int e);

int main(void){
  int* v;
  for(int i = 10; i <= 30; i = i + 10){
    v = (int*) malloc (i*sizeof(int));
    for(int j = 0; j < i; j++)
        v[j] = j;
    bq(v, 0, i-1);
    for (int k = 0; k < i; k++){
        printf("%d ", v[k]);
    }
    free(v);
    printf("\n");
  }
  return 0;
}

void bq(int* v, int s, int e){
  if (e+s+1 > 2){
    int m = (e+s+1) / 2;
    bq(v, m+1, e);
    bq(v, s, m-1);
    int aux = v[e];
    v[e] = v[m];
    v[m] = aux;
  } 
}

1 Ответ

1 голос
/ 27 апреля 2019

Добавьте оператор printf в начало вашей bq функции:

void bq(int* v, int s, int e) {
    printf("e=%d, s=%d,  e+s+1=%d\n", e, s, e + s + 1);
    if (e + s + 1 > 2) {

Когда вы запустите свою программу, вы увидите, что это вывод;

e=9, s=0,  e+s+1=10
e=9, s=6,  e+s+1=16
e=9, s=9,  e+s+1=19
e=9, s=10,  e+s+1=20
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
e=9, s=11,  e+s+1=21
...

Другими словами, функция bq сходится к простому рекурсивному вызову себя с теми же параметрами: bq(v, 9, 11).Но поскольку 9+11+1 всегда больше, чем 2, он находится в бесконечном рекурсивном цикле.В противном случае известен как переполнение стека.В результате у вас заканчивается память стека, и программа вылетает.

Мои экстрасенсорные способности предлагают следующую строку:

if (e+s+1 > 2){

Был предназначен для выражения "если у меня есть хотя бы два элементав диапазоне v [s..e] ".В этом случае он должен выглядеть следующим образом:

if (e-s+1 > 2){

Не уверен, что остальная часть вашей программы правильная, но это только начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...