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

您从未将任何内容存储到数组的最后一个元素中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

有两个错误:

  1. 索引 n - 1 处的元素永远不会初始化,因为您的第一个循环仅从 0 变为 n - 2。

  2. 索引 n 处的元素超出了分配的内存。

因此,您打印的最后一个元素在第一次运行时具有索引 n,在第二次运行时具有索引 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 回答