1

当我测试以下代码时,我不断收到分段错误。搜索网络后,我目前无法找到答案。

a = (byte *)malloc(sizeof(byte) * x ) ; 

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

y 和 x 都被初始化。X 是用户确定的数组大小。分段错误出现在要添加的倒数第二个整数上,我通过添加 printf("roar") 找到了这一点;在将 a[i] 设置为 y 并一次输入一个数字之前。Byte 是 unsigned char 的 typedef。

注意:我也尝试过使用

a[i] = (byte)y ;

A初始化如下

byte *a ;

如果你需要查看整个代码是这样的:

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

int p_cmp_f () ;

int main( int argc, char *argv[] ) 
{
  int x, y, i, choice ;

  byte *a ;

  while( choice !=2 )
    {
      printf( "Would you like to sort integers?\n1. Yes\n2. No\n" ) ;

      scanf("%d", &choice ) ;

      switch(choice)
    {
    case 1:
      printf( "Enter the length of the array: " ) ;

  scanf( "%d", &x ) ;

  a =  (byte *)malloc(sizeof( byte ) * x ) ;

  printf( "Enter %d integers to add to the array: ", x ) ;

  for( i = 0 ; i < x -1 ; i++ )
    {
    scanf( "%d", &y ) ;

    a[i] = y ;
    }
  switch( choice )
    {
    case 1:
      bubble_sort( a, x, sizeof(int), p_cmp_f ) ;

      for( i = 0 ; i < x ; i++ )
    printf( "%d", a[i] ;


      break ;

    case 2:
      selection_sort( a, x, sizeof(int),  p_cmp_f ) ;

      for( i = 0 ; i < x; i++ )
    printf( "%d", a[i] ;


      break ;

    case 3:
      insertion_sort( a, x, sizeof(int), p_cmp_f ) ;

      for( i = 0 ; i < x ; i++ )
    printf( "%d", a[i] ;


      break ;

    case 4: 
      merge_sort( a, x, sizeof(int), p_cmp_f ) ;

      for( i = 0 ; i < x ; i++ )
    printf( "%d", a[i] ;

      break ;

    case 5:
      quick_sort( a, x, sizeof(int), p_cmp_f ) ;

      for( i = 0 ; i < x ; i++ )
    printf( "%d", a[i] ;


      break ;

    default:
      printf("Enter either 1,2,3,4, or 5" ) ;

      break ;
    }
    case 2:
      printf( "Thank you for using this program\n" ) ;

      return 0 ;

      break ;

    default: 
      printf( "Enter either 1 or 2: " ) ;

    break ;
    }
}
  free(a) ;

  return 0 ;
}

int p_cmp_f( byte *element1, byte *element2 )
{
  return *((int *)element1) - *((int *)element2) ;
}
4

1 回答 1

1

运行该代码我得到一个调试异常,因为未定义选择的初始值,您应该添加

choice = 0;

在while循环之前。还有以下声明:

for( i = 0 ; i < x -1 ; i++ )

应该:

for( i = 0 ; i < x; i++ )

如果您使用的编译器检测到未初始化的内存,则这两者中的任何一个都可能导致异常。进行这些更改后,它在 Visual Studio 2010 下对我来说很好。我还建议为您的编译器打开最大警告级别,它可能会选择第一种情况。

我不确定这是否是您想要的,但是在内部 case 语句的嵌套案例中,最后的中断丢失了,所以它总是转到“感谢您使用这个程序”部分,而不是循环返回另一个选择。也因为 return 语句用于退出函数,而不是仅仅让它下降到底部 free(a) 永远不会被调用。

我建议不要将 case 嵌套成两个函数,而是将顶层 case 保留在原处,然后使用 perform_sort 之类的函数,它有一个 case 可以根据用户输入进行正确的排序。这将使这一切更容易遵循,您还可以在调用该函数后打印结果,而不是复制循环来打印结果。

于 2012-12-11T04:30:37.680 回答