【发布时间】:2016-04-26 06:15:02
【问题描述】:
我在 C 中编写了一个数组分区算法,但它给了我错误“分段错误:核心转储”。 代码如下:
#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;
}
有人可以帮我找出问题所在吗?谢谢。
【问题讨论】:
-
我看到的第一个错误,你认为
scanf()是成功的。' -
数组索引范围从
0到n-1。所以for (i=0; i<=n; ++i)应该是for (i=0; i<n; ++i)和其他循环中的类似变化。又为什么看了--n--n? -
如果枢轴值超出数据范围,索引将打破数组边界。
-
在
while (i<j && A[j]>x){ ++j; }中你增加了j但j被初始化为n。所以j应该递减。 -
我做了 --n;因为代码是从另一个程序粘贴的,我在该程序中询问数组中有多少个值。在 c 中,第一个元素索引为 0,因此没有 --n;放置 9 意味着一个包含 10 个值的数组。这不是导致程序崩溃的原因。
标签: c arrays algorithm partition