Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Memory Management_Local - Fatal编程技术网

在C语言中,内存何时分配给局部变量

在C语言中,内存何时分配给局部变量,c,variables,memory-management,local,C,Variables,Memory Management,Local,因为局部变量也称为自动变量,当函数被访问时,应该在运行时分配内存 intmain(){ int a;//声明 返回0; } int main(){ int a[];//编译错误,缺少数组大小 返回0; } int main(){ int a[2];//声明,但如果没有数组大小,则无法工作, //所以在编译时它是被检查的! 返回0; } 我的问题是,在C中声明数组_大小是否只是一个规则,还是在编译时为数组分配内存(仍然是局部变量) 它是如何工作的 数组是一个变量,根据K&R.第161页的C编程。

因为局部变量也称为自动变量,当函数被访问时,应该在运行时分配内存

intmain(){
int a;//声明
返回0;
}
int main(){
int a[];//编译错误,缺少数组大小
返回0;
}
int main(){
int a[2];//声明,但如果没有数组大小,则无法工作,
//所以在编译时它是被检查的!
返回0;
}
我的问题是,在C中声明数组_大小是否只是一个规则,还是在编译时为数组分配内存(仍然是局部变量)

它是如何工作的


数组是一个变量,根据K&R.第161页的C编程。

如sgar91在注释中所述,在调用函数时会分配一个数组(如您的示例中所示),该数组的大小必须是确定的。如果需要动态数组,则必须在堆上分配内存

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

当您声明自动变量(如函数参数或局部变量)时,会发生自动分配。自动变量的空间在输入包含声明的复合语句时分配,在退出该复合语句时释放。

这就是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个整数。

对于局部变量,它们消耗的内存在堆栈上。这意味着它们必须在编译时具有已知的固定大小,以便在调用函数时,通过更改堆栈指针的值将所需的确切内存量添加到堆栈中。这就是数组必须有一个大小的原因:调用函数时,堆栈上的字节数必须改变固定的数量

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

int main(){
    int a[2];
    return 0;
}
这里,
inta[2]
是名为
a
的变量的定义
a
是两个
int
的数组

实际上,编译器会发出代码,将堆栈上的空间用于两个相邻的
int
对象(可能是8个字节,但
int
的大小取决于实现)。当然,这是假设优化器不会删除对象,因为您从未使用过它


int a[99999999]得到的编译器错误是由编译器强制执行的硬限制造成的,因为它知道(或无论如何假定)永远不会有足够的堆栈来实现这一点。

当您声明局部变量时,它的大小在编译时已知,但内存分配发生在执行时

所以在您的示例中,对于编译器来说,没有大小的数组显然是个问题,因为它不知道要包含到汇编代码中的大小

如果您不知道数组的大小,可以始终使用指针类型和
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
}

在C语言中,局部变量和自动变量之间存在差异。局部变量可以是自动的,也可以是静态的,这决定了当程序第一次执行时,它的内存是在堆栈上分配的,还是永久分配的

使用此代码:

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

这是一个不完整的数组。该错误是因为编译器不知道程序需要分配多少
int

数组大小应该在编译时知道,您可以直接或间接地将大小传递给数组,因为内存在编译时决定,但在运行时分配,除了
对于可变大小的数组。

在编译时如何分配变量?@sgar91:该代码中没有任何静态数组。@H2CO3当然是由编译器分配的。我相信它分配了大量的资金。哦你的意思是在正在编译的程序中。。纳米=P@sgar91这将是一个本地固定长度数组变量。@linuxDeveloper-Nah。编译器在编译时发出指令,使程序在运行时分配内存。感谢您的帮助。我们称之为int a[2]={9,8,4};声明或定义。@linuxDeveloper:尝试定义无效({}列表中的项太多)。请注意,定义是声明,但它们是创建它们声明的对象的特定类型的声明。再次感谢。我可以得到一些关于这个定义的详细信息吗?是声明,任何链接都可以,因为这是一个常见问题。在main()之外声明的变量呢?@wannik data segment。与静态相同
感谢您的回复和提及静态,@Valeri Atamaniouk