在函数中使用 realloc() 调整 int 指针大小时出现问题

Problems when using realloc() in a function to resize the int pointer

我想先做一个大小为10的int*,然后写一个add()函数来添加元素。如果元素的数量大于 10,函数将使用 realloc() 来调整 int* 的大小。但是我收到了错误消息。我该如何改进?

这是我所做的:

int main()
{
    int size = 10;
    int* a;
    a = (int*)malloc(size*sizeof(int*));
    int i;
    double start, stop;
    start = clock();

    for (i = 0; i < 100000; i++){
        add(&a, i, size, i);
    }

    stop = clock();
    printf("Adding arry by one: %10.2f\n", stop - start);

    return 0;
}


void add(int *a, int element, int size, int index)
{
    if (index < size)
    {
        a[index] = element;
    }
    else if (index >= size)
    {
        a = realloc(a, sizeof(int*)*(index + 1));
        a[index] = element;
    }
}

你的指针a是函数add的参数。参数只是该函数中的局部变量,因此当您分配 a = realloc (...) 时,调用函数中的 a 不会更改。这将很快崩溃。大小也未调整 - 如果您在索引 17 处添加一个元素,然后在索引 12 处添加元素,则您的数组将调整为 13 个元素。

您可以使用BLUEPIXY的解决方案。我更喜欢创建一个包含指针和大小的结构,然后传递它并让代码更新它。避免很多**;它们对你的大脑不好:-)

您必须将 int * a 参数更改为 int ** a。我对结构做了一些改动:

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

#define SIZE 10

void add(int**a, int element, int size, int index) {
  if (index >= size) {
    *a = realloc(*a, sizeof(int)*(index + 1));
  }
  (*a)[index] = element;
}

int main() {
  int *a = malloc(SIZE*sizeof(int));
  double start, stop;

  start = clock();

  for (int i = 0; i < 100000; i++) {
    add(&a, i, SIZE, i);
  }

  stop = clock();

  printf("Adding arry by one: %10.2f\n", stop - start);

  free(a);

  return 0;
 }

Malloc 和 realloc 应该针对 (int) 的大小而不是 (int*) 的大小来完成