如何减少 C 中数组中当前未使用的保留内存?

How to reduce the reserved memory that is not currently being used in an array in C?

假设我们在C中为一个数组预留了32个字节,但结果我们只使用了24个字节,如何减少当前未使用的预留内存?这可能吗?

我没有使用 malloc,但我可以。

这是最小的可复制示例:

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

int main() {
 
    FILE *input;
    input = fopen("1.txt", "r");

    int arr[4][300];

    if (input == NULL) {
       printf( "ERROR. Coundn't open the file.\n" ) ;
    } else {
        for (int i = 0; i < 300; i++) {
            fscanf(input, "%d %d %d %d", &arr[0][i], &arr[1][i],
                    &arr[2][i], &arr[3][i]);
        }
        fclose(input);

        int sze = 0;
        for (int i = 0; i < 300; i++) {
             for (int j = 0; j < 4; j++) {
                if (abs(arr[j][i]) >= 1)
                    sze += log10(abs(arr[j][i])) + 1;
                else
                    sze++;

                if (arr[j][i] < 0)
                   sze++;
             }
        }
        printf("Size %d kB\n", sze);
    }

    return 0;
}

澄清:我需要的是尽可能减少数组中每个元素使用的内存。假设我存储了数字 45,它不会占用 int 的所有 4 个字节,所以我需要减少分配给 1 个字节的内存。正如我所说,我目前没有使用 malloc,但如果有办法实现我想要的,我可以切换到 malloc。

如果要减少某个值的使用 space,您需要将其分配给不同类型的对象。

在您的示例中,您从一个 int 开始,它可能在您的系统上使用 4 个字节。然后在其中存储值“45”,它只需要一个字节。大小为 1 字节的类型例如 int8_tsigned char.

首先,变量的类型一旦定义就无法更改。您可以将其存储在 另一个 变量中。

其次,数组的所有元素必须是同一类型。

所以给定示例的答案只是“否。

如果你想“压缩”存储的值,你需要滚动你自己的类型。您可以发明某种“向量”,以尽可能少的字节存储每个值。您还需要存储每个值的大小。并且您需要对每个矢量元素实现访问功能。这不是一个简单的任务。