如何在C函数中返回`realloc`数组

时间:2018-05-10 09:05:30

标签: c arrays pointers realloc

我想将数字附加到空数组中,并且这些数字的数量在开始时是未知的。例如,生成从1到10的数字并逐个追加。

generateFromOneToTen会将我的结果保存在output中,而count应该在执行后保存为10。如果我在此功能中打印结果,一切都会好的。

int generateFromOneToTen(int *output, int count)
{
    for (int i = 0; i < 10; i++) {
        output = arrayAppendInt(output, i + 1, count);
        count++;
    }

    // Print result of `output` is 1,2,3...10 here

    return count;
}

我实现了arrayAppendInt来动态增加数组的长度,并在旧数据后添加新值。

int *arrayAppendInt(int *array, int value, int size) 
{
    int newSize = size + 1;
    int *newArray = (int*) realloc(array, newSize * sizeof(int));

    if (newArray == NULL) {
        printf("ERROR: unable to realloc memory \n");
        return NULL;
    }

    newArray[size] = value;

    return newArray;
}

问题就出现了。调用生成函数时,numbers将始终为NULL。如何将生成的数字返回到numbers变量?

int *numbers = NULL;
int count = 0;
count = generateFromOneToTen(numbers, 0);
                             ^^^^^^^

3 个答案:

答案 0 :(得分:3)

您可以使用指向整数(int **)指针的指针:

int generateFromOneToTen(int **output, int count)
{
    for (int i = 0; i < 10; i++) {
        *output = arrayAppendInt(*output, i + 1, count);
        count++;
    }
    // `*output` is 1,2,3...10 here
    return count;
}

您可以像这样重写arrayAppendInt函数:

int *arrayAppendInt(int *array, int value, int size) 
{
    int newSize = size + 1;
    int *newArray;
    if (array==NULL)
      newArray = (int*) malloc ((1+size) * sizeof(int));
    else
      newArray = (int*) realloc(array, newSize * sizeof(int));

    if (newArray == NULL) {
        printf("ERROR: unable to realloc memory \n");
        return NULL;
    }

    newArray[size] = value;

    return newArray;
}

并称之为*output = arrayAppendInt(*output, i + 1, i);

答案 1 :(得分:0)

最简洁的解决方案是(在我看来)将数组+簿记(大小,已使用)打包到结构中,并使用(指针)此结构作为参数。

#include <stdlib.h>

struct dopedarray {
        unsigned size;
        unsigned used;
        int *array;
        };

现在您可以将所有分配和bookkkeeping内容放入一个函数中(可以内联):

int array_resize(struct dopedarray *ap, unsigned newsize)
{
int *newp;

if(!ap) return -1;

newp = realloc (ap->array, newsize*sizeof*ap->array);
  // check return value here...
if (!newp) return -1;

free(ap->array);
ap->array = newp;
ap->size = newsize;

  // bookkeeping sanity
if(ap->size > ap->used ) { ap->used > ap->size; }

return 0;
}

add_element函数也需要稍微更改一下:

int array_add_element(struct dopedarray *ap, int value)
{
if(ap->used >= ap->size){
        unsigned newsz;
        newsz= ap->used ? 2*ap->used: 4;
        array_resize(ap, newsz);
        // check return value here...
        }

ap->array[ap->used++] = val;
return 0;
}

答案 2 :(得分:0)

我的问题的完整代码:

int generateFromOneToTen(int **output, int count) // +
{
    for (int i = 0; i < 10; i++) {
        *output = arrayAppendInt(*output, i + 1, count); // ++
        count++;
    }

    return count;
}

int *arrayAppendInt(int *array, int value, int size) 
{
    int newSize = size + 1;
    int *newArray = (int*) realloc(array, newSize * sizeof(int));

    if (newArray == NULL) {
        printf("ERROR: unable to realloc memory \n");
        return NULL;
    }

    newArray[size] = value;

    return newArray;
}

int *numbers = NULL;
int count = 0;
count = generateFromOneToTen(&numbers, 0); // +

这个答案也值得一读:https://stackoverflow.com/a/9459803/1951254