0

私はプログラミングの目的でUbuntuLinuxを使用しています。昨日、私は非常に奇妙な問題に遭遇しました。それは本当に本当にあいまいで、奇妙でした。

問題は、バブルソート、ロジック、構文をすべて実行しようとしたが、出力が間違っていたことです。私はWindowsで同じプログラムを書きましたが、うまくいきました。LinuxでEclipseIDEを使用しています。何が問題になる可能性がありますか?反対側では、バブルソートを実行するためにポインター(参照による呼び出し)を使用しましたが、Ubuntuでは出力も間違っていましたが、Windowsでは出力は問題ありませんでした。私はそれを理解する方法がわかりません。

バブルソートの私のコードは次のとおりです。

#include<stdio.h>

void main(void)
{
  int array[] = {4,2,6,3,1,5,8,4,6,1};
  int i=0;
  int j=0;
  for(i=1;i<=10;i++)
    {
      for(j=0;j<=10-i;j++)
        {
          if(array[j]>array[j+1])
            {
              int temp = array[j];
              array[j] = array[j+1];
              array[j+1] = temp;
            }
        }
    }
  for(i=0;i<=9;i++)
    {
      printf("%d\t",array[i]);
    }
}

出力:

gcc -o bubblesort.c -o output
./output


2 3 4 1 5 6 4 6 1 1
4

3 に答える 3

4

配列の境界を超えることは未定義の動作(そのサブセットは「正しく」動作する)であり、これがプログラムで発生していることです。配列はゼロベースのインデックスを使用します。これは、最後の有効なインデックスが配列内の要素の数より1つ少ないことを意味します。

/* 10 elements in 'array'. */
int array[] = {4,2,6,3,1,5,8,4,6,1};

for(j=0;j<=10-i ;j++)
{
    if(array[j]>array[j+1]) /* When 'j' is 9 the
                               'array[j + 1]' is
                               out of bounds. */

内部forループの終了条件を変更します。

for(j=0;j<=9-i ;j++)

ハードコーディングの代わりに9、コード全体で、の要素数を取得するために10使用できます。これにより、エラーが発生しにくくなり、後で要素の数を変更するのが簡単になります。sizeof(array)/sizeof(array[0])arrayarray

const int ARRAY_SIZE = sizeof(array)/sizeof(array[0]);
于 2012-10-05T11:20:45.327 に答える
2

これ:

for(j=0;j<=10-i;j++)

これと一緒に:

if(array[j]>array[j+1])

範囲外の配列にアクセスする他の場所が問題の原因である可能性があります。

範囲外の配列へのアクセスは未定義の動作です。

于 2012-10-05T11:22:05.253 に答える
1

これは、バブル ソートの擬似コードです。

for (i = 0; i < 9; i++) {
    for (j = i + 1; j < 10; j++) {
        if (element[i] > element[j]) swap_elements();
于 2012-10-05T11:23:24.933 に答える