2016-01-20 3 views
-1

Я написал алгоритм разбиения массива в C, но он дает мне ошибку «segmentation fault: core dumped». Вот код:Ошибка времени выполнения алгоритма разделения. Может ли кто-нибудь помочь мне найти то, что не так?

#include <stdio.h> 

int main(void){ 
int n; 
printf("insert array width\n"); 
scanf("%d", &n); 
--n; 
int A[n]; 
int i,j,p; 
int x,t; 

//inserimento valori array 
printf("insert values\n"); 
for (i=0; i<=n; ++i){ 
scanf("%d", &A[i]); 
} 

printf("the array A is:\n"); 
for (i=0; i<=n; ++i){ 
    printf("%d ", A[i]); 
} 
printf("\n"); 

Это фактический алгоритм раздела, и убедиться, что проблема здесь.

printf("insert the pivot value\n"); 
scanf("%d", &x); 
i=0; 
j=n; 
while (i<j && A[i]<=x){ 
    ++i; 
    } 
while (i<j && A[j]>x){ 
    ++j; 
    } 
if (A[j]>x) { 
    --j; 
    } 
while (i<j){ 
    t=A[i]; 
    A[i]=A[j]; 
    A[j]=t; 
    ++i; 
    ++j; 
    while (A[i]<=x){ 
     ++i; 
     } 
    while (A[j]>x){ 
     ++j; 
     } 
    } 
p=j; 

printf("the result of the operation is:\n"); 
for (i=0; i<=n; ++i){ 
    printf("%d ", A[i]); 
} 

return 0; 
} 

Может кто-нибудь помочь мне найти в чем дело? Спасибо.

+1

Первая ошибка, которую я вижу, вы считаете, что 'scanf()' был успешным. ' –

+3

Диапазон индекса массива от '0' до' n-1'. Поэтому 'for (i = 0; i <= n; ++ i)' должно быть 'for (i = 0; i

+1

Если значение поворота выходит за допустимые пределы, индексирование приведет к разрыву границ массива. –

ответ

0
--n; 
int A[n]; 

Теперь A имеет n-1 элементы, но вы до сих пор доступ к элементу п, который не существует. По крайней мере, поменяйте местами две строки или сохраните исходное значение n, так как оно больше C-ish (и запустите петли до i<n).

while (i<j && A[j]>x){ 
    ++j; 
    } 

Вы должны уменьшить j. В остальной части кода вы продолжаете увеличивать j, но я уверен, что вы должны уменьшить его.

+0

Спасибо, это сработало. Я не знаю, как я не видел такой очевидной ошибки, учитывая, что я часами пытался найти то, что черт не так с этим. – ydl2007