1

次のコードをテストすると、セグメンテーション違反が発生し続けます。現在、ウェブを検索しても答えが見つかりません。

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

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

y と x の両方が初期化されます。X は、ユーザーが決定した配列のサイズです。セグメンテーション違反は、最後から2番目に追加される整数にあります。これは、 printf("roar") を追加することで見つかりました。a[i] を y に設定し、一度に 1 つの数字を入力する前に。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++ )

初期化されていないメモリを検出するコンパイラを使用している場合、これら 2 つのいずれかが例外を引き起こした可能性があります。これらの変更を行った後、Visual Studio 2010 で問題なく動作しました。また、コンパイラの最大警告レベルをオンにすることをお勧めします。おそらく、最初の状況が発生したはずです。

それが意図したものかどうかはわかりませんが、内側のケースステートメントのネストされたケースでは、最後のブレークが欠落しているため、別の選択肢にループバックするのではなく、常に「このプログラムを使用していただきありがとうございます」の部分に移動します。また、 return ステートメントを使用して関数を終了するのではなく、関数を一番下にドロップするのではなく、 free(a) が呼び出されることはありません。

ケースを入れ子にするのではなく、2 つの関数に分割することをお勧めします。最上位のケースはそのままにして、ユーザー入力に基づいて正しい並べ替えを行うケースを持つ perform_sort のような関数を用意します。これにより、すべてが非常に簡単になり、ループを複製して結果を出力する代わりに、その関数を呼び出した後に結果を出力することもできます。

于 2012-12-11T04:30:37.680 に答える