在 C 语言中,当我们不知道要保存在数组中的数据的大小时。通常,我们指定的尺寸大于要求的尺寸。
首先,如果我们在编译时不知道大小,我们通常不需要也不指定比要求更大的大小。这可能是你的印象,但事实并非如此。
在这种情况下使用了两种方法。
使用可变长度数组(VLA) 或动态内存分配。
任何 C 实现都不支持 VLA。它们最初是在 C99 中发明的,对于符合 C99 的实现是强制性的,但在符合后来的 C 标准的实现中,不需要支持VLA 。因此,使用 VLA 会使您的代码不可移植(如果可以使用的话)。
此外,处理错误的能力在使用 VLA 时更差。您无法检查 VLA 的分配是否成功。
如果可移植性和/或错误处理很重要,您最好使用动态内存分配。
分配数组 VS。变长数组
与 malloc/free 相比,使用 C99 VLA 是个好主意吗?
使用可变长度数组是否安全?
何时在 C 中使用可变长度数组,但何时使用动态分配?
除此之外,如果您喜欢动态内存,您可以调整大小并释放不再需要的内存,而 VLA 无法做到这一点。
声明数组时指定的大小是否比要求的大?
谈到在编译时固定大小的静态分配数组,通常指定比所需更大的大小并不是一个坏习惯。当然,您可能会浪费一些内存,但当您需要更多内存或尝试意外访问超出范围的内存时,保持安全总是一个好决定,而不是遇到真正的严重问题,这会调用未定义的行为。
但是,如果浪费大小的数量很大并且可能大小之间的范围非常大,那么您应该真正使用动态内存分配。例如,您不知道是否需要预先设置 10 个或 100000 个元素,并且为了安全起见分配了 100000 个元素。那将是一种不好的做法。
在这种情况下使用动态内存也更好,因为堆栈没有堆内存那么大。
简短摘要:如果您真的不想浪费任何内存并且想要安全,请使用动态内存分配而不是其他任何东西。