【问题标题】:Partition algorithm runtime error. Can someone help me to find what is wrong?分区算法运行时错误。有人可以帮我找出问题所在吗?
【发布时间】: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() 是成功的。'
  • 数组索引范围从0n-1。所以for (i=0; i&lt;=n; ++i) 应该是for (i=0; i&lt;n; ++i) 和其他循环中的类似变化。又为什么看了--n--n
  • 如果枢轴值超出数据范围,索引将打破数组边界。
  • while (i&lt;j &amp;&amp; A[j]&gt;x){ ++j; } 中你增加了jj 被初始化为n。所以j应该递减。
  • 我做了 --n;因为代码是从另一个程序粘贴的,我在该程序中询问数组中有多少个值。在 c 中,第一个元素索引为 0,因此没有 --n;放置 9 意味着一个包含 10 个值的数组。这不是导致程序崩溃的原因。

标签: c arrays algorithm partition


【解决方案1】:
--n;
int A[n];

现在An-1 元素,但您仍然可以访问不存在的元素n。至少交换两行,或保留原始 n 值,因为它更 C-ish(并运行循环直到 i&lt;n)。

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

你应该减少j。 在其余代码中,您不断增加 j,但我相当确定您应该减少它。

【讨论】:

  • 谢谢,它成功了。我不知道为什么我没有看到如此明显的错误,因为我花了几个小时试图找出它到底出了什么问题。
猜你喜欢
  • 2022-11-24
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2020-04-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多