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

时间:2016-07-04 22:22:35

标签: c pointers realloc

我想首先制作一个大小为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;
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您必须将int *参数更改为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;
 }

答案 2 :(得分:0)

对于(int)的大小,应该完成malloc和realloc而不是(int *)的大小