假設我們在 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。
uj5u.com熱心網友回復:
如果要減少某個值的使用空間,則需要將其分配給不同型別的物件。
在您的示例中,您從int可能在您的系統上使用 4 個位元組的一個開始。然后將值“45”存盤在其中,它只需要一個位元組。大小為 1 個位元組的型別是例如int8_tor signed char。
首先,一旦定義了變數,就不能更改它的型別。您可以將其存盤在另一個變數中。
其次,陣列的所有元素都必須是相同的型別。
所以給定例子的答案就是“不”。
如果要“壓縮”存盤的值,則需要滾動自己的型別。您可以發明某種“向量”,根據需要將每個值存盤在盡可能少的位元組中。您還需要存盤每個值的大小。并且您將需要實作對每個向量元素的訪問功能。這不是一項簡單的任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369522.html
下一篇:如何實作信號量書中的偽代碼?
