c - 在 C 中给定开始和结束内存地址的意外行为遍历数组

标签 c arrays pointers dynamic-arrays

打印数组时出现以下差异:

上次运行的输出,给定数组大小为 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]);
  }
}

最佳答案

您从未将任何内容存储到数组 ints[n-1] 的最后一个元素中.您打印了错误的数组最后一个元素,这会调用未定义的行为,因为您读取的内容超出了分配的内存区域的末尾。

更改初始化循环以初始化所有成员,方法是循环 while i < n .删除你的 printf()在循环之后,而是只打印一个换行符。

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

关于c - 在 C 中给定开始和结束内存地址的意外行为遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18194084/

相关文章:

c - 从脚本调用带有两个参数的 C 可执行文件

c - 在C编程中通过比较或其他方式根据结构体数组找到最小数量

c - 递增数组指针

delphi - 在 Delphi 中将静态数组作为动态数组的参数传递

php数组指针奇怪

用汇编函数编译 C 程序,反之亦然

ios - 正确检查 Objective-C 中是否存在 C 函数

java - 有没有办法在java中使用图形按钮设置数组的值?

c - 函数调用内的 Malloc 似乎在返回时被释放?

C++:将结构成员视为数组