在main的外部和内部定义各种类型的数组

时间:2017-10-09 18:56:32

标签: c arrays struct main

假设我有以下代码:

#define SIZE 5

    ### FIRST OPTION ###

int main(int argc , char** argv){

    ### SECOND OPTION ###

    return 0;
}

我已经在网上查了一下,当我编写这三个代码语句(编译和运行时)而不是第一个选项行和第二个选项行时,我们无法真正理解这三个代码语句之间的区别(每个语句都会被写入单独):

  1. struct my_struct array[SIZE]
  2. static struct my_struct array[SIZE]
  3. struct my_struct** array = (struct my_struct**)malloc(SIZE*sizeof(struct my_struct*))
  4. 迈克尔

1 个答案:

答案 0 :(得分:0)

选项'1'可用于在全局范围或函数范围内定义数组,例如main。在下面的示例中,'array'在全局范围内声明,并且在链接时可能对任何其他模块可见(如果这样的模块将其声明为'extern'。程序中只有该数组的一个副本。 / p>

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'是一个正常的函数,规则也适用于那里。

使用static(#2)更改分配的含义。如果在外部使用,则只有一个与此特定文件关联的数据副本。它将在文件内部显示,但不能从外部显示。

static struct my_struct array[SIZE];
int main() {
   ...
   array[0] = ...;
}

如果你在函数中使用它,那么它只是与该函数关联的一个副本。它不会在调用相同函数之间发生变化,并会保留以前的值。它也只能从函数内部看到。

int foo() {
    static struct my_struct array[SIZE];
    ....
    array[0].counter++;

}

对于#3,所有全局/静态规则保持不变,但仅针对指针。指针包含动态分配数组的内存地址。