4

一世)static int a, b, c;

ii)int a; int b; int c;

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

4

4 回答 4

6
static int a,b,c;

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

int a; int b; int c;

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

于 2013-07-18T13:10:19.497 回答
4

内存大小没有区别

static int a,b,c;
int a;int b;int c;

生命周期位置范围初始化存在差异。

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

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

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

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

优化可能会影响位置,尤其是对于可以很容易地保存在寄存器中的功能性非静态 a、b、c。优化还可以确定该变量未使用并将其优化出来,从而占用 0 个字节。

于 2013-07-18T13:58:34.697 回答
0

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

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

于 2013-07-18T13:45:29.243 回答
0

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

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

于 2013-07-18T13:59:23.573 回答