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

标签 c arrays struct program-entry-point

假设我有以下代码:

#define SIZE 5

    ### FIRST OPTION ###

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

    ### SECOND OPTION ###

    return 0;
}

我已经在线检查过,并且无法真正理解当我编写这三个代码语句(在编译和运行时)而不是第一个选项行和第二个选项行时它们之间有什么区别(每个语句将单独编写) :

  1. struct my_struct 数组[SIZE]
  2. 静态结构 my_struct 数组[SIZE]
  3. struct my_struct** array = (struct my_struct**)malloc(SIZE*sizeof(struct my_struct*))

迈克尔

最佳答案

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

文件1.c

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

该文件可以访问file1.c中的声明

文件2.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,所有全局/静态规则保持不变,但仅针对指针。该指针包含动态分配数组的内存地址。

关于c - 在 main 外部和内部定义各种类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46653219/

相关文章:

c# - C 字符串文字与 P/Invoke 无法正常工作的 C 字符串数组/指针

javascript - 如何将 Ajax 调用 array(json) 放入全局数组?

java - Java中打印方法的混淆

dictionary - 如何使用 GO 构建结构图并向其附加值?

c - 为什么两个字符指针之间的字符串复制不起作用?

java - C 客户端套接字数据无法在 Java 服务器中读取

c++ - 处理大型数组时超出时间限制

c - MPI 上带有指针的结构

c# - 比较日期时发生 StackOverflowException

c - 杀死一个进程最终会挂起