使用动态阵列时增加内存

时间:2014-01-05 09:30:42

标签: c arrays dynamic malloc realloc

首先,我想说我确实在搜索,但我不明白为现有问题提出的解决方案。

这是我的问题。

Array *create()
{
        static Array *arr1;
        void *arraypointer;

        if ((arraypointer = (Array *) malloc(sizeof(Array))) == NULL) {
                printf("Array not created because no memory is available. \n");
        } else {
                arraypointer = arr1;
                printf("Array created successfully. \n");
        }

        return arr1;
}

我假设这很好。现在,我想在数组中添加一些东西,所以显然我需要增加内存的大小。目前,我有这个。

void add(Array S[], Item x)
{
        static Array *arr1;
        void *arraypointer;

        arraypointer = (Array *) malloc(sizeof(Array) + 1);

        if (is_element_of(x, S) == true) {
                printf
                    ("Item already exists in array and therefore it can't be added. \n");
        } else {
                strcpy(S->arr1[S->s].sinput, x.sinput);
                S->arr1[S->s].iinput = x.iinput;
                S->s++;
                printf("Item added successfully. \n");
        }

}

我觉得这不好,虽然我不确定我该怎么做。我得到的警告是在Add方法中没有使用arr1和arraypointer。

我该怎么办?

由于

P.S。如果你保持简单,我将不胜感激,因为我仍然试图围绕这个malloc事物。

3 个答案:

答案 0 :(得分:0)

使用malloc分配内存并在之后调整大小后,您必须使用realloc。否则,如果再次使用malloc,您将获得一个全新的数组。此外,如果您忘记调用free,您将收到内存泄漏,b / c“旧”数组未被释放。使用realloc保留当前数组的内容。

另请查看此相关问题:Differences between using realloc vs. free -> malloc functions

答案 1 :(得分:0)

  

我认为这很好。

不,不是,抱歉。仔细查看您的代码:假设malloc成功,首先,它将新分配的内存区域分配给arraypointer(实际上没有理由成为void *,您应该制作它Array *),然后将arr1分配给arraypointer。之后,您刚刚丢失了对先前分配的块的引用。因此,您的程序包含内存泄漏。

我没有看到使用arr1的重点,我无法理解你为何选择static。为什么不这样呢?

Array * create()
{
    Array *arraypointer;

    if ((arraypointer = malloc(sizeof(*arraypointer))) == NULL) {
        printf("Array not created because no memory is available. \n");
    }  else {
        printf("Array created successfully. \n");
    }
    return arraypointer;
}

您进入add()的警告是因为您实际上并未使用arr1arraypointer:您只是使用S。在函数的代码中没有任何地方使用这些变量。我猜你想在这里使用realloc,但很难说,因为你没有向我们展示Array的结构定义。

答案 2 :(得分:0)

这与你的不同,但感觉如下

typedef int Item;

typedef struct da {
    size_t s;//now size of array
    Item *arr;//dynamic array
} Array;

Array *create(void){
    Array *ap;

    if((ap = malloc(sizeof(Array)))== NULL){
        fprintf(stderr, "Array not created because no memory is available. \n");
    } else {
        fprintf(stderr, "Array created successfully. \n");
        ap->s = 0;
        ap->arr = NULL;
    }
    return ap;
}

bool is_equal(Item x, Item y){
    return x == y;
}

bool is_element_of(Item x, Array *S){
    size_t i;
    for(i = 0; i < S->s ; ++i){
        if(is_equal(x, S->arr[i]))
            return true;
    }
    return false;
}

void add(Array *S, Item x){
    if (is_element_of(x, S) == true){
        fprintf(stderr, "Item already exists in array and therefore it can't be added. \n");
    } else {
        S->arr = realloc(S->arr, (S->s + 1) * sizeof(Item));
        if(S->arr == NULL){
            fprintf(stderr, "Memmory could not allocate.\n");
        } else {
            S->arr[S->s++] = x;
            fprintf(stderr, "Item added successfully. \n");
        }
    }
}