【问题标题】:How can i save space in array which is not being used? [closed]如何在未使用的数组中节省空间? [关闭]
【发布时间】:2018-01-28 15:59:33
【问题描述】:

如果我创建一个大小为 10 的数组,并且只有 2 个元素存储在数组中,那么剩余的空间就会被浪费。那么我该如何解决这个问题呢? (按数据结构)

【问题讨论】:

  • 创建一个大小为 2 的数组?这会是一个选择吗?
  • 如果数组是动态分配的,你可以简单地使用 realloc()。
  • @ Daniele 是的,但是我有什么办法可以通过使用数据结构来避免这种情况?
  • 如果您的意思是 struct,则只有在 struct 包含指向数组的已分配指针而不是数组本身时,您才能减少数组长度。
  • "我可以避免"到底要避免什么?更多上下文可能会有所帮助。

标签: c arrays memory data-structures realloc


【解决方案1】:

您可以使用简单的链表而不是数组,或者如果您需要使用数组,那么您应该使用realloc(),这会将数组缩小为仅使用 2 个单元格,而不是 10 个。 ,像这样:

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

int main(void)
{
    int* ptr = malloc(10 * sizeof(int));
    ptr[0] = 4;
    ptr[1] = 13;
    ptr =  realloc(ptr, 2 * sizeof(int));
    printf("%d %d\n", ptr[0], ptr[1]);
    return 0;
}

输出:

4 13

【讨论】:

  • 谢谢你解决了问题
  • @NachiketMore 然后接受我的回答。您可以通过单击我帖子左侧的勾号来做到这一点。
【解决方案2】:

在大多数情况下,您会使用动态内存分配。这意味着调用malloc 来获取初始内存量,然后在空间耗尽时调用realloc,最后调用free,将内存返回到竞技场。这是一个从标准输入中读取一行的函数。它返回动态分配的内存

#define INITALLOC  16  /* #chars initally alloced */
#define ALLOCSTEP   8  /* #chars to realloc by */
int getline(char **dynline)
{
    int i, c;
    size_t nalloced;  /* #chars currently alloced */

    if ((*dynline = malloc(INITALLOC)) == NULL)
        return -1;  /* return -1 on mem. err */
    nalloced = INITALLOC;
    for (i = 0; (c = getchar()) != EOF; ++i) {
        /* buffer is full; request more mem */
        if (i == nalloced)
            if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL)
                return 0;
        /* store the newly read character */
        (*dynline)[i] = c;
    }
    /* zero terminate the string */
    (*dynline)[i] = '\0';

    if (c == EOF)
        return 0;  /* return 0 on EOF */

    return 1;
}

此函数的用户负责释放内存。例如:

char *buf;
printf("What is your full name?\n");
if (getline(&buf) > 0)
    puts(buf);
free(buf);

当然,还是有一些浪费,但是用数组是不可能解决的。考虑一个链表https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多