C中使用结构的大多数示例使用malloc
将所需大小的内存块分配给指向该结构的指针。但是,具有基本类型(int
,char
等)的变量将分配给堆栈,并假设有足够的内存可用。
我理解这背后的想法是内存可能不适用于较大的结构,所以我们使用malloc
来确保我们确实有足够的内存但是在我们的结构很小的情况下这是否真的有必要?例如,如果一个结构只包含三个整数,那么我肯定可以假设有足够的内存吗?
所以我的问题实际上归结为C中关于何时需要malloc
变量以及理由是什么的最佳实践?
答案 0 :(得分:2)
你不必分配内存的唯一时间是你静态分配内存时,这就是当你有这样的语句时会发生的情况:
int number = 5;
您始终可以将其写为:
int *pNumber = malloc(sizeof(int));
但你必须确保释放它,否则你会泄漏记忆。
您可以使用结构执行相同的操作(而不是为其动态分配内存,静态分配):
struct some_struct_t myStruct;
并通过以下方式访问成员:
myStruct.member1 = 0;
etc...
动态分配和静态之间的最大区别在于,该数据是否在当前范围之外可用。使用静态分配,它不是。动态是,但你必须确保释放它。
遇到麻烦的地方是必须从函数返回结构(或指向它的指针)。您必须在返回它的函数内动态分配,或者您必须传入一个指向外部(动态或静态)分配的结构的指针,然后该函数可以使用该函数。
答案 1 :(得分:1)
好的代码被重用了。好的代码几乎没有大小限制。写出好的代码。
只要有多个缓冲区大小,就使用malloc()
。
写入int
的缓冲区大小:所需的缓冲区大小最多为sizeof(int)*CHAR_BIT/3 + 3
。使用固定缓冲区。
写入double
的缓冲区大小与sprintf(buf, "%f",...
中一样:所需的缓冲区大小可能是数千字节:使用malloc()
。或者使用sprintf(buf, "%e",...
并使用固定缓冲区。
形成文件路径名可能涉及数千个char
。使用malloc()
。