在 main 的外部和内部定义各种类型的数组
Define array in various types outside and inside of main
假设我有以下代码:
#define SIZE 5
### FIRST OPTION ###
int main(int argc , char** argv){
### SECOND OPTION ###
return 0;
}
我在网上查过,当我写这三个代码语句(在编译和运行时)而不是第一个选项行和第二个选项行(每个语句将被写个别):
struct my_struct array[SIZE]
static struct my_struct array[SIZE]
struct my_struct** array = (struct my_struct**)malloc(SIZE*sizeof(struct my_struct*))
迈克尔
选项“1”可用于在全局范围或函数范围内定义数组,例如 main。在下面的示例中,'array' 在全局范围内声明,并且在 link 时间对任何其他模块都可能可见(如果这样的模块将其声明为 'extern'。只有一个副本程序中的这个数组。
file1.c
struct my_struct array[SIZE];
int main() {
...
array[0] = ...;
}
此文件可以访问 file1.c
中的声明
file2.c
extern struct my_struct array[SIZE];
void foo() {
...
array[1] = array[0];
}
现在,如果您在函数内声明它,则每次调用该函数时都会分配(在堆栈中)数组的新副本。
int foo() {
struct my_struct array[SIZE];
....
}
它只会在函数内部可见。 'main' 是一个普通函数,规则也适用于此。
使用静态 (#2) 改变了分配的含义。如果在外部使用,则只有一份与该特定文件关联的数据副本。它将在文件内部可见,但在外部不可见。
static struct my_struct array[SIZE];
int main() {
...
array[0] = ...;
}
如果您在函数内部使用它,那么它将只是与此函数关联的一个副本。它不会在对同一函数的调用之间发生变化,并将保留以前的值。它也只能在函数内部可见。
int foo() {
static struct my_struct array[SIZE];
....
array[0].counter++;
}
对于#3,所有 global/static 规则保持不变,但只是针对指针。该指针包含动态分配数组的内存地址。
假设我有以下代码:
#define SIZE 5
### FIRST OPTION ###
int main(int argc , char** argv){
### SECOND OPTION ###
return 0;
}
我在网上查过,当我写这三个代码语句(在编译和运行时)而不是第一个选项行和第二个选项行(每个语句将被写个别):
struct my_struct array[SIZE]
static struct my_struct array[SIZE]
struct my_struct** array = (struct my_struct**)malloc(SIZE*sizeof(struct my_struct*))
迈克尔
选项“1”可用于在全局范围或函数范围内定义数组,例如 main。在下面的示例中,'array' 在全局范围内声明,并且在 link 时间对任何其他模块都可能可见(如果这样的模块将其声明为 'extern'。只有一个副本程序中的这个数组。
file1.c
struct my_struct array[SIZE];
int main() {
...
array[0] = ...;
}
此文件可以访问 file1.c
中的声明file2.c
extern struct my_struct array[SIZE];
void foo() {
...
array[1] = array[0];
}
现在,如果您在函数内声明它,则每次调用该函数时都会分配(在堆栈中)数组的新副本。
int foo() {
struct my_struct array[SIZE];
....
}
它只会在函数内部可见。 'main' 是一个普通函数,规则也适用于此。
使用静态 (#2) 改变了分配的含义。如果在外部使用,则只有一份与该特定文件关联的数据副本。它将在文件内部可见,但在外部不可见。
static struct my_struct array[SIZE];
int main() {
...
array[0] = ...;
}
如果您在函数内部使用它,那么它将只是与此函数关联的一个副本。它不会在对同一函数的调用之间发生变化,并将保留以前的值。它也只能在函数内部可见。
int foo() {
static struct my_struct array[SIZE];
....
array[0].counter++;
}
对于#3,所有 global/static 规则保持不变,但只是针对指针。该指针包含动态分配数组的内存地址。