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