当内存分配在C局部变量(When is memory allocated to local vari

2019-07-21 12:14发布

由于局部变量也叫自动变量,应该在运行时被分配的内存,当访问功能。

int main(){
    int a; // declaration 
    return 0;
}

int main(){
    int a[]; // compilation error, array_size missing
    return 0;
}

int main(){
    int a[2]; // declaration, but can't work without array_size, 
              // so at compile time it is checked!
    return 0;
}

我的问题是,它只是一个规则,在ARRAY_SIZE申报C,或存储在编译时分配给阵列(还是局部变量)

它是如何工作的?

数组是按照由K&R C编程的变量。 第161号。

Answer 1:

当你声明局部变量,它的大小是在编译时已知的,但在执行期间出现内存分配。

因此,在你的例子,阵列没有大小显然是编译器的问题,因为它不知道什么是大小要加入到汇编代码。

如果你不知道数组的大小,你可以随时使用指针类型和malloc / free ,甚至alloca 。 前两个操作上堆和alloca实际使用堆栈。

值得注意的例外是静态变量。 对他们来说,存储在编译/链接时已经被分配而不能在运行时改变。

例子:

int main(int argc, const char *argv[])
{
    int a; // a is a sizeof(int) allocated on stack
}

int main(int argc, const char *argv[])
{
    int a[2]; // a is a sizeof(int)*2 allocated on stack
}

int main(int argc, const char *argv[])
{
    int *a; // a is a sizeof(int*) allocated on stack (pointer)
    a = alloca(sizeof(int)*4); // a points to an area with size of 4 integers
                               // data is allocated on stack
}

int main(int argc, const char *argv[])
{
    static int a; // a is allocated in data segment, keeps the value
}


Answer 2:

int main(){
    int a[2];
    return 0;
}

这里, int a[2]; 是一个名为变量定义 aa是2个的阵列int

会发生什么情况在实践中是编译器生成代码,以在堆栈上使用空间2个相邻int对象(大概8个字节,但大小int达到实现)。 这是假设,当然,对象没有被删除的优化,因为你从来没有使用它的。

编译器错误,您得到了int a[999999999]; 是由于编译器执行一些硬性限制,因为它知道(或假设反正)将永远不会有足够的堆栈为。



Answer 3:

有在C. 本地自动变量之间的差的局部变量可以是自动的静态的 ,这决定了它的存储器是否被分配在堆栈上,或永久地,首先执行该程序时。

有了这个代码:

int main(){
  int a[];    //compilation error, array_size missing
  return 0;
}

这是一个不完整的阵列 。 这个错误是因为编译器不知道有多少int S中的计划将需要分配。



Answer 4:

作为sgar91在评论中指出,一个阵列,例如在你的例子被分配当一个函数被调用,并且必须是大小确定的。 如果你需要动态数组,你必须在堆上分配的内存。

int *values = malloc(sizeof(int) * array_count);


Answer 5:

当你声明自动变量,如函数参数或局部变量自动分配情况。 输入含有声明的复合语句时用于自动变量的空间被分配,并且当该复合语句退出被释放。



Answer 6:

那是在C,其中数组和指针是不一样的点。

就拿这个例子:

int main(){
   int a[5];
   int * b = malloc(sizeof(int) * 5);

  printf("sizeof a = %d\n",sizeof a);
  printf("sizeof int[5] = %d\n",sizeof(int[5]));
  printf("sizeof b = %d\n",sizeof b);

  free(b);
  return 0;
}

这将返回:

sizeof a = 20
sizeof int[5] = 20
sizeof b = 4

变量a是内部声明为INT [5],整数指针指向与5个整数空间的存储器块。



Answer 7:

对于局部变量,它们消耗的内存是在栈上。 这意味着它们必须有在编译时已知的固定尺寸,这样,当调用该函数时,需要的存储器的确切量由改变堆栈指针的值添加到堆栈。 这就是为什么该阵列的尺寸必须:当调用该函数时字节堆栈上的数量必须以固定量发生变化。

调用malloc()和类似从堆中分配存储器; 在运行时以这种方式分配的内存是可变大小的。



Answer 8:

阵列尺寸应在编译时已知的,并且可以传递大小直接到阵列或间接地作为存储器是在编译时决定,但在运行时分配,除了可变尺寸的阵列。



文章来源: When is memory allocated to local variables in C