数组声明符号是C中malloc的简写吗?

问题描述 投票:0回答:3

来自这个教程网站

要在 C 中声明一个数组,程序员指定数组的类型 元素和数组所需的元素数量如下 -

type arrayName [ arraySize ];

似乎这个语法declares数组并在内存中给它空间,但它没有初始化任何值。

这似乎类似于

malloc
命令。上面的符号是
malloc
的简写吗?

arrays c initialization malloc declaration
3个回答
3
投票

这似乎类似于 malloc 命令。上面的符号是 malloc 的简写?

不,不是。

根据存储持续时间,未初始化的对象将是:

  1. 归零有
    static storage duration
  2. 没有初始化如果他们有
    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 每次都会创建对象的新实例。的初始值 对象是不确定的。


1
投票

这里相关的是storage duration的C概念,它主要是告诉一个变量保证保持有效的时间,还有一个变量是否/如何被默认初始化以及在什么条件下它持有不确定值(本质上是“垃圾价值”)。

  • 具有静态存储持续时间的对象保证被零初始化。在任何函数之外和/或声明为

    static
    的所有对象都具有静态存储持续时间。因此,如果您的示例中的数组是在任何函数之外声明的,则 保证 被零初始化。

  • 具有 automatic storage duration 的对象 not 初始化,除非程序员明确这样做。这些都是在局部范围内声明的变量,我们称之为局部变量。但也是函数的参数。如果您的示例中的数组是在函数内部声明的,那么它具有自动存储持续时间并且它包含的值是不确定的。

  • 具有 allocated storage duration 的对象是由

    malloc
    函数族显式创建的对象。它们是否被初始化取决于所使用的函数:
    malloc
    不初始化值但让它们不确定,
    calloc
    确实将所有值初始化为零。

所以碰巧,具有自动存储持续时间的变量与从

malloc
返回的具有分配存储持续时间的数据具有相同的初始化规则。但这就是这两种变量类型的共同点。

C 语言没有规定在内存中存储某些内容的位置。然而在实践中,可以假设 C 中的堆分配仅在函数明确声明时才会发生。除了

malloc
系列,还有一些非标准的,如
strdup
getline
明确记录了它们在内部使用堆分配。

话虽这么说,例如 stdio.h 的某些实现可能会在内部使用堆分配——就 C 标准而言,这很好。如果他们不记录下来,他们也会在内部进行清理

free()


0
投票

不,函数 malloc 在运行时从空闲存储(或堆)分配内存。这个内存可以像数组一样访问,但它被分配给一个pointer。当我们事先不知道它需要多大时,通常会使用这个动态分配的“数组”。还需要使用函数 free 释放内存。

© www.soinside.com 2019 - 2024. All rights reserved.