![]() |
1
5
不要 担心会浪费100或1000个字节,这些字节对于所有的名字来说都足够长了。 我可能会把你读到的缓冲区放在堆栈上。 做 担心在缓冲区末尾写入。即缓冲区溢出。防止这种情况的程序! 当您将名称存储到结构中时,可以使用malloc缓冲区来存储所需的确切长度的名称(不要忘记为空终止符添加额外的字节)。 但如果您真的必须存储任何长度的名称,那么您可以使用realloc来实现。 也就是说,分配一个malloc大小为50字节的缓冲区。 当你需要更多的空间时,使用realloc来增加它的长度。以50字节为单位增加块的长度,并用一个int来跟踪它的大小,以便知道何时需要再次增加它。在某个时候,你必须决定缓冲区的长度,因为它不能无限期地增长。 |
![]() |
2
2
你可以一个字符一个字符地读字符串,直到找到结尾,然后倒回开头,分配一个大小合适的缓冲区,然后重新读到结尾,但是除非你在一个小型的嵌入式系统上,否则这可能是愚蠢的。首先,fgetc、fread等函数无论如何都会在O/S中创建缓冲区。 您可以分配一个足够大的临时缓冲区,对其使用长度限制读取(为了安全起见),然后分配一个精确大小的缓冲区将其复制到其中。您可能希望在堆栈上而不是通过malloc分配临时缓冲区,除非您认为它可能超出可用的堆栈空间。 如果您正在为一个小系统编写单线程代码,您可以在启动时或静态地分配一个临时缓冲区,并将其重新用于许多目的-但要非常小心,您的使用不能重叠! 考虑到大多数系统的实现复杂性,除非你真正研究事物是如何工作的,否则完全有可能编写内存优化的代码,而不是简单地做事情。变量初始化可能是另一个令人惊讶的浪费。 |
![]() |
3
2
我的建议是分配一个足够大的缓冲区:
一般来说,大多数名字(至少是常见的英文名字)的大小将小于80个字符。如果你觉得你可能需要更多的空间,那就一定要分配更多的空间。 保留一个计数器变量,以了解已读入缓冲区的字符数:
此时,逐字阅读
我想你是在读
我理解希望尽可能保持小的缓冲区,并且只分配您需要的内容,但是学习如何编程的一部分是理解代码/数据大小、效率和代码可读性方面的权衡。你可以
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 6 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 6 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 7 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 7 月前 |