C 为以下类型的声明分配的内存大小是否有差异:

C 为以下类型的声明分配的内存大小是否有差异:,c,C,i) 静态int a、b、c ii)inta;int b;INTC 我不确定如何为这些类型的声明分配内存。如果这些声明不同,那么为每个声明分配多少内存 static int a,b,c; 将在程序的数据部分分配三个整数(可能每个32位,或4个字节)。只要程序运行,它们就会一直存在 int a; int b; int c; 将在堆栈上分配三个整数。它们将在超出范围时消失。被定义为静态的变量将在编译时分配到数据段中。全局变量也是如此,即使它们不是静态的。在运行时输入块时,在块内定义的非静态变量在

i)
静态int a、b、c

ii)
inta;int b;INTC

我不确定如何为这些类型的声明分配内存。如果这些声明不同,那么为每个声明分配多少内存

static int a,b,c;
将在程序的数据部分分配三个整数(可能每个32位,或4个字节)。只要程序运行,它们就会一直存在

int a; int b; int c;

将在堆栈上分配三个整数。它们将在超出范围时消失。

被定义为静态的变量将在编译时分配到数据段中。全局变量也是如此,即使它们不是静态的。在运行时输入块时,在块内定义的非静态变量在堆栈上分配,在退出块时取消分配


分配的内存量取决于实现。该标准要求int的大小足以容纳16位(2字节)的值,但is可以更大。现在您可能会使用的大多数编译器都使用32位整数。

内存大小之间没有差异

static int a,b,c;
int a;int b;int c;
在生命周期、位置、范围和初始化方面存在差异

生存期:如果这些是全局声明的,那么在程序的生存期内,a、b、c集都将存在。如果它们都在一个函数中,那么静态的会在程序生命周期内存在,而另一个只会在函数的持续时间内存在。此外,若递归或重入调用该函数,则会存在多个非静态a、b、c集合

位置:一个常见的,被认为是C不需要的,是有一个数据段和堆栈段的内存。全局变量倾向于进入数据以及函数静态变量。函数中a、b、c的非静态版本通常会在堆栈中继续

作用域:简单视图:函数声明的变量(静态或非静态)在函数内的作用域。声明为静态的全局变量具有文件作用域。未声明为静态的全局变量具有整个程序的作用域

初始化:遵循与生存期相同的轨迹。全局声明的a、b、c(静态或非静态)都在程序启动时初始化。如果a、b、c在函数中,则只初始化静态函数(在程序启动时)。功能性非静态a、b、c未初始化


优化可能会影响位置,特别是对于功能性非静态a、b、c,它们很容易保存在寄存器中。优化还可能确定变量未被使用,并对其进行优化,因此需要0字节。

如果我们假设第二个声明在函数内部,则正如Bard和Nashant所说,这些将分配到不同的内存部分(取决于操作系统和编译器)


但是,尽管可变大小的大小相同,但它们可以消耗不同的内存量。例如,如果递归调用函数(来自第二次声明),则将有来自第二次声明的多个变量实例。

一个警告-第二种情况假设它们是在函数内部声明的。如果它们是在全球范围内发布的,我认为它们也会出现在数据部分。严格地说,学究式的做法是,很少有操作系统会将它们放在数据部分。他们很可能进入bss。如果它们在一个函数中,如果有足够的寄存器,非静态的可能根本不会得到分配给它们的内存。谢谢。这似乎很有用:)带关键字的静态变量将被分配0@ClaudioDaffra全局变量,即使没有说明符“static”,也将在程序启动时初始化。C11 6.2.4.3.几个好的答案已经讨论了分配的“位置”,因此我不再重复,也不需要另一个单独的答案。但是,我想指出的是,每个
int
所使用的内存将完全相同,但是完全可能的是,对齐或其他问题可能会决定分配给这些变量的实际内存可能比实际用于这些变量的内存要多一些。