4

配列を印刷するときに、次の不一致が生じます。

配列サイズが 10 の場合の最後の実行の出力:

1054923524,536171146,1590310503,900411369,764853670,471563977,933417110,1800497411,544592671,135121
1054923524,536171146,1590310503,900411369,764853670,471563977,933417110,1800497411,544592671,0,

私が思っていたのではなく、なぜ「0」と表示されるのですか? (配列の最後の桁)

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

main() {
  srandom(time(NULL));
  printf("Size:");
  int n;
  scanf("%d",&n);
  int *ints;
  ints=malloc(sizeof(int)*n);
  int i;
  for(i=1; i<n-1;i++) {
    int a=random();
    ints[i]=a;
    printf("%d,",a);
  }
  printf("%d\n",ints[n]);
  sort(&ints[0],&ints[n]);
  free(ints);
}

void sort(int *begin, int *end) {
  int i;
  for(i=0;&(begin[i])!=end;i++) {
    printf("%d,",begin[i]);
  }
}
4

3 に答える 3

3

array の最後の要素に何も格納していませんints[n-1]。割り当てられたメモリ領域の末尾を超えて読み取っているため、配列の間違った最後の要素を出力すると、未定義の動作が発生します。

while をループして、すべてのメンバーを初期化するように初期化ループを変更しますi < n。次のループを削除printf()し、代わりに改行文字を出力します。

  for(i=0;i<n;i++) {
    int a=random();
    ints[i]=a;
    printf("%d,",a);
  }
  putchar('\n');
于 2013-08-12T18:35:43.630 に答える
1

次の 2 つの間違いがあります。

  1. 最初のループは 0 から n - 2 までしか進まないため、インデックス n - 1 の要素は初期化されません。

  2. インデックス n の要素は、割り当てられたメモリを超えています。

したがって、出力する最後の要素は、最初の実行ではインデックス n を持ち、2 回目の実行ではインデックス n - 1 を持ちます。

修正は次のようになります。

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

main() {
  srandom(time(NULL));
  printf("Input desired size of array:");
  int n;
  scanf("%d",&n);
  int *ints;
  ints=malloc(sizeof(int)*n);
  if(ints==NULL) {
    perror("malloc returned NULL");
    exit(1);
  }

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

  sort(&ints[0],&ints[n],0);
  free(ints);
}

void sort(int *begin, int *end, int ascending) {
  int i;
  for(i=0;&(begin[i])!=end;i++) {
    printf("%d,",begin[i]);
  }
}
于 2013-08-12T18:36:30.197 に答える
0

printf("%d\n",ints[n]);

これはオーバーフローであり、未定義の動作です。あなたが欲しいprintf("%d\n",ints[n-1]);

于 2013-08-12T18:35:28.913 に答える