何时使用静态数组与动态数组C
我对C有点陌生,我只是想知道是否存在一种情况,一种情况优于另一种情况,这取决于一个人的偏好,或者是否有一种情况总是优于另一种情况。注意“静态”一词在C中还有其他含义。您似乎在询问使用常量(如何时使用静态数组与动态数组C,c,arrays,memory,dynamic,static,C,Arrays,Memory,Dynamic,Static,我对C有点陌生,我只是想知道是否存在一种情况,一种情况优于另一种情况,这取决于一个人的偏好,或者是否有一种情况总是优于另一种情况。注意“静态”一词在C中还有其他含义。您似乎在询问使用常量(如inta[40])声明数组与使用可变长度(如inta[n])声明数组之间的区别,其中n在运行时已知,但在编译时通常不知道 在这种情况下,一般规则是在可以执行以下操作时使用静态大小: 当编译时知道确切的大小时,或 当上界已知时,使用上界不会浪费太多空间 通常,使用静态大小更有效,因为编译器有更多的信息,因此
inta[40]
)声明数组与使用可变长度(如inta[n]
)声明数组之间的区别,其中n
在运行时已知,但在编译时通常不知道
在这种情况下,一般规则是在可以执行以下操作时使用静态大小:
- 当编译时知道确切的大小时,或
- 当上界已知时,使用上界不会浪费太多空间
inta[40];a[13]=2;
,编译器可以计算a[13]
是从a
开始的13•4=52字节(当然,假设是四字节int
)或者将数组大小作为直接操作数包含在指令中(这意味着它内置于代码中,不必在内存中查找或在运行时获取)
如果编译器不知道数组大小,它必须在程序运行时生成完整的代码来计算地址。在今天的典型编程环境中,这通常不是一个很大的成本,但可能是一个考虑因素
此外,如果数组具有静态大小,则它可以是外部对象(在任何函数之外定义)。外部对象具有静态存储持续时间,这意味着它们在运行程序的整个生命周期内都存在。(此处,“static”用于C意义,不同于固定大小意义。)当编译器知道数组的大小时,它可以规划程序启动时提供的数组存储。这使具有静态大小的数组具有静态存储持续时间。对于具有动态大小的数组,编译器通常无法为它们规划必要的存储,因此它们不能是外部对象。这取决于用例还有两个大问题:1)是否需要在运行时调整数组的大小?以及2)您希望阵列(在堆上或“自动”(堆栈)存储)在哪里?两者都是有效的选项,并且都有各自的用例。通常,如果您事先知道数组的大小,但不想以后调整它的大小,请在堆栈上进行分配。否则,在堆上进行分配。@Someprogrammerdude:这种用法中“静态”和“动态”的区别要么是在块中声明
inta[3]
而不是inta[n]
(在这种情况下,两者都在堆栈上),要么是将维度声明为其他内容的一部分,例如动态分配,如int(*p)[2][3]=malloc(…)代码>与int(*p)[a][b]=malloc(…)代码>,在这种情况下,两者都被分配,区别仅在于代码生成(硬编码地址计算与按大小的运行时乘法。将大小从静态(常量)更改为动态(可变长度)通常不会更改存储位置。感谢您的见解,这正是我所要寻找的。您是否推荐任何特定的文档或书籍,以获得有关此主题的更多见解?我从java开始学习C,我对内存的工作原理非常感兴趣。@ZezePinto:C更像是“自己动手”语言与Java相比。总的来说,让事情更简单更好——固定大小比可变大小更好。C仍然可以从Kernighan和Ritchie的书中学习,作为一个起点。是的,这是我在过去几周里意识到的。再次感谢您的输入,非常感谢