来自这个教程网站:
要在 C 中声明一个数组,程序员指定数组的类型 元素和数组所需的元素数量如下 -
type arrayName [ arraySize ];
似乎这个语法declares数组并在内存中给它空间,但它没有初始化任何值。
这似乎类似于
malloc
命令。上面的符号是malloc
的简写吗?
这似乎类似于 malloc 命令。上面的符号是 malloc 的简写?
不,不是。
根据存储持续时间,未初始化的对象将是:
static storage duration
automatic storage duration
type array_static_storage_duration [ arraySize ];
void foo(void)
{
type array_automatic_storage_duration [ arraySize ];
static type array_static_storage_duration1 [ arraySize ];
}
当您退出定义它们的范围时,自动存储持续时间对象将停止存在。
使用
malloc
分配的对象具有allocated storage duration
并且它们的生命周期与程序相同(除非你free
它们)
来自C标准:
标识符声明为外部或内部的对象 链接,或带有存储类说明符 static 具有静态存储 期间。它的生命周期是程序的整个执行及其 存储值仅在程序启动之前初始化一次。
一个对象,其标识符被声明为没有链接且没有 存储类说明符静态具有自动存储持续时间。
5 对于 这样一个没有变长数组类型的对象,它的 生命周期从进入与其关联的块开始 直到该块的执行以任何方式结束。 (输入一个封闭的 块或调用一个函数暂停,但不结束,执行 当前块。)如果块是递归输入的,一个新的 每次创建对象的实例。的初始值 对象不确定。如果为 对象,它在每次到达声明时执行 块的执行;否则,该值变得不确定 每次宣告达成。
6 对于这样一个对象 具有可变长度数组类型,其生命周期从 对象的声明,直到程序的执行离开 声明的范围。27) 如果范围是递归输入的,a 每次都会创建对象的新实例。的初始值 对象是不确定的。
这里相关的是storage duration的C概念,它主要是告诉一个变量保证保持有效的时间,还有一个变量是否/如何被默认初始化以及在什么条件下它持有不确定值(本质上是“垃圾价值”)。
具有静态存储持续时间的对象保证被零初始化。在任何函数之外和/或声明为
static
的所有对象都具有静态存储持续时间。因此,如果您的示例中的数组是在任何函数之外声明的,则 保证 被零初始化。
具有 automatic storage duration 的对象 not 初始化,除非程序员明确这样做。这些都是在局部范围内声明的变量,我们称之为局部变量。但也是函数的参数。如果您的示例中的数组是在函数内部声明的,那么它具有自动存储持续时间并且它包含的值是不确定的。
具有 allocated storage duration 的对象是由
malloc
函数族显式创建的对象。它们是否被初始化取决于所使用的函数:malloc
不初始化值但让它们不确定,calloc
确实将所有值初始化为零。
所以碰巧,具有自动存储持续时间的变量与从
malloc
返回的具有分配存储持续时间的数据具有相同的初始化规则。但这就是这两种变量类型的共同点。
C 语言没有规定在内存中存储某些内容的位置。然而在实践中,可以假设 C 中的堆分配仅在函数明确声明时才会发生。除了
malloc
系列,还有一些非标准的,如 strdup
和 getline
明确记录了它们在内部使用堆分配。
话虽这么说,例如 stdio.h 的某些实现可能会在内部使用堆分配——就 C 标准而言,这很好。如果他们不记录下来,他们也会在内部进行清理
free()
。
不,函数 malloc 在运行时从空闲存储(或堆)分配内存。这个内存可以像数组一样访问,但它被分配给一个pointer。当我们事先不知道它需要多大时,通常会使用这个动态分配的“数组”。还需要使用函数 free 释放内存。