如果我在一个嵌入式系统上,我痴迷于高效的内存管理,我该如何存储像 64 字节密码这样具有内存块效率的东西?
例如我会做
int len = 65;
char password[len ];
memset(password, 0, len );
GetPwFunction(password);
password[len - 1] = '\0';
但是现在我用 65 而不是 64 创建了一些更丑陋的东西(至少这是其他程序员告诉我的......)。
如果我在一个嵌入式系统上,我痴迷于高效的内存管理,我该如何存储像 64 字节密码这样具有内存块效率的东西?
例如我会做
int len = 65;
char password[len ];
memset(password, 0, len );
GetPwFunction(password);
password[len - 1] = '\0';
但是现在我用 65 而不是 64 创建了一些更丑陋的东西(至少这是其他程序员告诉我的......)。
仅当+1
您想存储 C 字符串时才需要 65 而不是 64,即如果您想将字符串传递给例如 aprintf
或strlen
其他字符串函数。这些函数需要一个终止字符\0
,因此您需要比实际内容多一个字节。如果您只想存储和检索字节,您可以继续使用64
. 如果是关于存储 8 位值,我会使用unsigned char
.
使用字节来存储始终为零的值是没有意义的。
您不需要使用 65 个字符来存储所有密码,前提是访问分配给单个密码的 64 字节缓冲区的任何代码都经过硬编码以在达到 64 字节限制时停止读取/写入。
只要您使用自己的代码来读取/写入该缓冲区,您仍然可以向其他函数提供以 null 结尾的字符串 - 这些将是原始字符串的副本。您只需要在读取之后并将字符串传递给其他代码之前自己附加空终止(并在写入缓冲区时忽略第 65 个字符)。因此,无论您存储多少密码,额外的字符只需要一次。
说了这么多……当您提到“内存块效率”时,我想知道您是否关心数据对齐问题,或者将数据拟合到特定结构中。最好(假设可能)简单地将最大字符长度减少到 63,并使用 64 个字节来存储始终以 null 结尾的字符串。