【问题标题】:Increase Memory when using a Dynamic Array使用动态数组时增加内存
【发布时间】:2014-01-22 19:08:20
【问题描述】:

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

这是我的问题。

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 。

我该怎么办?

谢谢

附:如果您保持简单,我将不胜感激,因为我仍在努力解决这个 malloc 问题。

【问题讨论】:

  • 对缩进做点什么
  • .. 还有你为什么用void *
  • 请向我们展示Array 结构。
  • 你的create函数的代码证实你很困惑。为什么保存返回值的变量是static?为什么拥有void* 类型的malloc 的返回的临时对象是void*?为什么不直接在声明时初始化呢?为什么要投malloc的回报?为什么将值与NULL进行比较,而不是直接使用指针值作为条件?为什么在else 子句中这样分配?您迫切需要阅读 SO 和其他方面的常见问题解答。
  • 我修正了你的缩进。好好看看你现在在做什么,看看是不是更清楚。

标签: c arrays dynamic malloc realloc


【解决方案1】:

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

也看看这个相关的问题:Differences between using realloc vs. free -> malloc functions

【讨论】:

  • 现在更有意义了。所以我现在真正的问题是如何使用 realloc。我将对如何使用 realloc 做一些研究。不过我可能会回来寻求更多帮助。
  • 这并不难。你给它指针,它是新的大小。通常大小比当前大小更大或更小,所以它没有差异或相似。 realloc 然后返回它分配内存并移动数组内容的地址。
【解决方案2】:

我认为这很好。

不,不是,抱歉。仔细看你的代码:假设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的结构定义。

【讨论】:

    【解决方案3】:

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

    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");
            }
        }
    }
    

    【讨论】:

    • @The__Malteser 如果你不能在你的环境中使用size_t,或者使用unsigned long(或unsigned long long)而不是size_t,或者我认为它应该使用@987654326 @.
    • size_t in stddef.h
    猜你喜欢
    • 2019-05-07
    • 2013-10-07
    • 2013-04-15
    • 1970-01-01
    • 2016-12-23
    • 2019-11-11
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多