Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用静态数组与动态数组C_C_Arrays_Memory_Dynamic_Static - Fatal编程技术网

何时使用静态数组与动态数组C

何时使用静态数组与动态数组C,c,arrays,memory,dynamic,static,C,Arrays,Memory,Dynamic,Static,我对C有点陌生,我只是想知道是否存在一种情况,一种情况优于另一种情况,这取决于一个人的偏好,或者是否有一种情况总是优于另一种情况。注意“静态”一词在C中还有其他含义。您似乎在询问使用常量(如inta[40])声明数组与使用可变长度(如inta[n])声明数组之间的区别,其中n在运行时已知,但在编译时通常不知道 在这种情况下,一般规则是在可以执行以下操作时使用静态大小: 当编译时知道确切的大小时,或 当上界已知时,使用上界不会浪费太多空间 通常,使用静态大小更有效,因为编译器有更多的信息,因此

我对C有点陌生,我只是想知道是否存在一种情况,一种情况优于另一种情况,这取决于一个人的偏好,或者是否有一种情况总是优于另一种情况。

注意“静态”一词在C中还有其他含义。您似乎在询问使用常量(如
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的书中学习,作为一个起点。是的,这是我在过去几周里意识到的。再次感谢您的输入,非常感谢