【问题标题】:Double an array dynamically动态加倍数组
【发布时间】:2021-12-10 08:32:52
【问题描述】:

我正在尝试用 C 解决以下练习:

"考虑一个函数 dobuleArray(),它接受输入一个数组和一个 指向其大小的指针,并将数组加倍作为输出。创建一个 大小为 1 到 4 的数组作为初始大小。然后,开始填充数组 2048 个随机生成的整数;每次数组满时,调用 doubleArray() 函数。每次调用后 doubleArray()​ , 再次打印数组的内容”​

我遇到了初始大小为 3 的问题。我编写的程序不适用于大于 4 的数字,我也不知道为什么。准确地说,我得到了一个realloc: invalid next size

int* doubleArray(int* vect, int* dim) {
  int old_dim = *dim;
  int i;
  int new_dim = old_dim * 2;
  vect = realloc(vect, new_dim * sizeof(int));
  for (i = old_dim; i < new_dim; i++) {
    vect[i] = 0;
  }
  *dim = new_dim;
  return vect;
}

int main() {
  int n = 3;
  int* size = &n;
  int* arr = malloc(n * sizeof(int));
  for (int i = 0; i < 2048; i++) {
    if (i > *size) {
      int j = 0;  // used to count the size of the doubled-array each time the
                  // if condition is true
      arr = doubleArray(arr, size);
      for (int i = 0; i < *size; i++) {
        j++;
        printf("%d ", arr[i]);
      }
      printf("\n");
      printf("%d\n", j);
      printf("\n");
      arr[i] = rand() % 6;
    } else {
      arr[i] = rand() % 6;
    }
  }
}

我认为,双重功能应该可以正常工作。整个程序实际上只适用于2048 % value == 0 这样的值。但我想应该有一种方法可以纠正它以使其适用于 3。

明确地说,这个程序的输出看起来像:

1 4 3 0 0 0 
6

realloc(): invalid next size
signal: aborted (core dumped)

【问题讨论】:

标签: arrays c realloc


【解决方案1】:

您写入超出数组的末尾,这会导致未定义的行为。 (在这种情况下很烦人的未定义行为)

    if (i > *size) {

应该是

    if (i >= *size) {

【讨论】:

  • 非常感谢您的帮助。将 (i==*size) 确定为条件就足够了。
猜你喜欢
  • 2014-08-15
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多