【问题标题】:Bubble sort programming via C通过 C 进行冒泡排序编程
【发布时间】:2016-02-09 19:36:38
【问题描述】:

我为冒泡排序编写了一个程序,它显示了一个运行时错误,说“NULL Pointer Assignment”。代码如下:

#include <stdio.h>

void main()
{
  int a[6], j = 0, count = 0, i, temp;

  printf("Enter the number");

  for(i = 0; i< 4; i++)
  {
    scanf("%d", &a[i]);
  }

  while(count < 4)
  {
    for(i = 0; i < 4; i++)
    {
      if(a[i] < a[++j])
      {
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }

    count++;
  }

  printf("The sorted array is");

  for(i = 0; i < 4; i++)
  {
    printf("\n%d\n", a[i]);
  }

  getchar();
}

但是当我尝试下面的代码时,它运行成功了。

#include <stdio.h>

void main()
{
  int a[6], count=0, i, temp;

  printf("Enter the number");

  for(i = 0; i < 4; i++)
  {
    scanf("%d", &a[i]);
  }

  while(count<4)
  {
    for(i = 0; i < 4; i++)
    {
      if(a[i] < a[i + 1])
      {
        temp = a[i];
        a[i] = a[i + 1];
        a[i + 1] = temp;
      }
    }

    count++;
  }

  printf("The sort array is");

  for(i = 0; i < 4; i++)
  {
    printf("\n%d\n", a[i]);
  }

  getchar();
}

所以我需要我的代码显示错误的原因,以及第二个代码工作的原因。我是 C 的新手,所以请简单地向我解释一下原因。

【问题讨论】:

  • 这是一个学习如何使用调试器的绝佳机会,调试器是程序员非常重要的工具。如果你在调试器中运行你的程序,它会捕获崩溃之类的东西,并在崩溃的位置停止。从那里您可以将函数调用堆栈向上移动到您的代码(如果崩溃尚未出现)并检查变量的值。即使您自己无法解决问题,那么至少请编辑您的问题以向我们展示在哪里崩溃发生在您的代码中。
  • 使用适当的缩进会极大地提高代码的可读性。
  • 顺便说一下,在第一个程序中,您的内部循环在排序时,变量jway 超出数组a 的范围,导致未定义的行为。在您的第二个程序中,您将在排序时将 fifth 元素包含在数组中,该元素已初始化,因此其值为 indeterminate,再次导致 未定义的行为.
  • 您知道一次可以扫描多个变量,像 scanf("%d %d %d %d", &amp;var1, &amp;var2, &amp;var3, &amp;var4) 这样的事情?
  • @JoachimPileborg 所说的。没有任何明显的调试尝试总是得到我的反对,无论从查看源代码来看,这个错误多么微不足道或多么明显。

标签: c bubble-sort


【解决方案1】:

您得到NULL pointer exception 的原因是在第一个程序中,通过完成while 循环的第一次迭代,j 的值已变为4。在 while 循环的第二次迭代中,j 的值不会被重置并从4 继续。当j 等于6 时尝试访问a[j] 将导致上述错误。

  for (i = 0; i < n - 1; i++) {
      for (j = 0; j <= i; j++) {
          if(a[j] > a[j + 1]) {
              // swap
          }
      }
  }

这样的事情就可以了。

【讨论】:

    【解决方案2】:

    原因是您没有在外部 while 循环的开头重置变量“j”,而在内部 for 循环中增加了 j。因此,您在内部 for 循环中的 4 个外部 while 循环转换中的每一个中增加 j 4 次。所以j 在第一个 while 循环之后已经达到了值 4。在第二轮 while 循环中,它将递增到 5、6、7、8 等。所以只需在 while 循环开始时将变量 j 重置为 0

    while(count<4)
    {
        j = 0;
        for(...
    

    顺便说一句,它仍然不是一个好的实现,因为您将最后一个值与未定义的值进行比较:if(a[3] &lt; a[4])a[3] 包含最后输入的值,而变量 a[4] 包含未定义的值。因此,您应该将 for 循环更改为 for(i=0;i&lt;3;i++)

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2014-03-26
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多