[英]how to allocate memory to store 5 names without wasting not even 1 byte
我想存储5个名称而不浪费1byte,因此如何使用malloc分配内存
出于所有实际目的,这是不可能的 , malloc
通常会返回比请求更大的内存块。
如果您知道这五个名称的累积长度,可以将其length_names
,您可以
void *pNameBlock = malloc(length_names + 5);
然后,您可以将名称以null终止(+5表示null终止)存储,名称pNameBlock
指向的内存中。
char *pName1 = (char *) pNameBlock;
将名称数据存储在* pName1。 也许通过char *p = *pName1;
然后,您可以逐字节写入(以下是伪代码)。
*p++ = byte1;
*p++ = byte2;
等等
以空终止结尾:
*p++ = '\\0';
现在设定
char *pName2 = p;
并使用p
写下第二个名字,如上所述。
用这种方式做事仍然会浪费一些内存。 Malloc将在内部获得比您要求的更多的内存,但是在此一项操作中,它只会浪费一次内存,从而获得这一块,而没有任何开销。
但是,请务必小心,因为在这种处理方式下,您不能将char *
s(例如pName1
)用作free()名称。 您只能释放一次获得的那个指针pNameBlock
。
如果您出于兴趣而问这个问题,可以。 但是,如果您的内存受限,您将很难过。 malloc确实会浪费一些内存,但不会浪费很多。 在这种限制下,您将很难使用C。 您几乎必须编写自己的超轻型内存管理器(您真的要这样做吗?)。 否则,如果您甚至不能浪费一个字节,那么最好还是进行汇编工作。
我很难想象哪种超局限型嵌入式系统会对内存使用量施加这种限制。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int n,i,c;
char *p[5];/*declare a pointer to 5 strings for the 5 names*/
for(i=0;i<5;i++)
{
n=0;
printf("please enter the name\n" );/*input name from the user*/
while((c=getchar())!='\n')
n++;/*count the total number of characters in the name*/
p[i]= (char *)malloc(sizeof(char)*n);/*allocate the required amount of memory for a name*/
scanf("%s",p[i]);
}
return 0;
}
如果您不想浪费任何字节来存储名称,则应在C中动态分配一个双精度数组(char)。
C语言中的double数组可以实现为指向指针列表的指针。
char **name; // Allocate space for a pointer, pointing to a pointer (the beginning of an array in C)
name = (char **) malloc (sizeof(char *) * 5); // Allocate space for the pointer array, for 5 names
name[0] = (char *) malloc (sizeof(char) * lengthOfName1); // Allocate space for the first name, same for other names
name[1] = (char *) malloc (sizeof(char) * lengthOfName2);
....
现在,即使名称长度不同,也可以将名称保存到数组中的相应位置,而无需分配更多空间。
您必须采用双指针概念,然后必须使用指针地址的增量逐个字符地输入名称,然后才能保存所有5个名称,以便节省内存。
但是,作为程序员,您不必使用这种繁琐的任务,您必须采用指针数组来存储名称,并且必须逐步分配内存。 这仅用于存储名称的概念,但是如果要处理大量数据,则必须使用链接列表存储所有数据。
当您分配一个块时,它实际上分配的内存比您要的多。 该额外的内存用于存储信息,例如分配的块的大小。
将名称编码为二进制并将其存储在字节数组中。
什么是“内存浪费”? 如果可以清楚地定义它,那么可以找到解决方案。
例如,以空终止的字符串中的空可能被视为“浪费的内存”,因为不打印空。 但是,另一个人可能不会认为它会浪费内存,因为没有它,您需要存储第二个项目(字符串长度)。
当我使用一个字节时,该字节已被完全使用。 只有您能告诉我如果没有该字节怎么办,我才认为您的内存浪费主张是正确的。 我在字符串的末尾使用空值。 如果我声明一个字符串数组,那么我也会使用该数组。 进行所需的操作,然后,如果发现可以重新排列这些项目以使用较少的内存,请确定另一种方法浪费了一些内存。 在那之前,您一直在追寻尚未完成的梦想。
如果这五个“名称”是程序集跳转点,则不需要完整的字符串值即可容纳它们。 如果这五个“名称”是块范围的变量,则它们可能不需要的内存将比寄存器已提供的更多。 如果它们是字符串,那么也许您可以组合并覆盖字符串; 但是,除非您想出一个解决方案,再将第二个解决方案与第一个解决方案进行比较,否则您不会浪费或节省内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.