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

km0tfn4u  于 2023-03-11  发布在  其他
关注(0)|答案(4)|浏览(102)

从此tutorial website
要在C语言中声明数组,程序员需要指定元素的类型和数组所需的元素数,如下所示−

type arrayName [ arraySize ];

看起来这个语法***声明了***数组,并给了它内存空间,但是它没有初始化任何值。
这看起来与malloc命令相似。上面的符号是malloc的简写吗?

tpgth1q7

tpgth1q71#

这里相关的是C语言中的 storage duration 概念,它主要告诉我们一个变量可以保证有效多长时间,但也告诉我们一个变量是否/如何被默认初始化,以及在什么条件下它持有一个 indeterminate value(本质上是“垃圾值”)。

  • 具有 static storage duration 的对象保证被零初始化。所有在函数外部声明和/或声明为static的对象都具有静态存储持续时间。因此,如果示例中的数组是在函数外部声明的,则它 * 保证 * 被零初始化。
  • 除非程序员显式地初始化,否则带有“自动存储持续时间”的对象不会被初始化。这些都是在局部作用域声明的变量,我们称之为局部变量。但也包括函数的参数。如果示例中的数组是在函数中声明的,那么它具有“自动存储持续时间”,并且它包含的值是不确定的。
  • 具有 * 分配存储持续时间 * 的对象是那些由malloc系列函数显式创建的对象。它们是否被初始化取决于所使用的函数:malloc不初始化这些值,而是使它们不确定,calloc将所有值初始化为零。

因此,正如所发生的那样,自动存储持续时间的变量与从malloc返回的分配存储持续时间的数据具有相同的初始化规则,但这是这两种变量类型的所有共同点。
C语言并没有规定内存中的存储位置。然而在实践中,C语言中的堆分配可能只会在函数明确表示要进行时才发生。除了malloc家族,还有一些非标准的家族,如strdupgetline,它们明确说明了它们在内部使用堆分配。
也就是说,一些实现,例如stdio. h,可能会在内部使用堆分配--这对于C标准来说是很好的,如果他们没有记录下来,他们也会在内部清理free()

1hdlvixo

1hdlvixo2#

这看起来和malloc命令很相似。上面的符号是malloc的简写吗?
不,不是的。
根据存储持续时间,未初始化对象将:
1.归零,具有 * static storage duration *
1.如果它们具有 * 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说明的,它具有静态存储持续时间。它的生存期是程序执行的整个过程,其存储值在程序启动前只初始化一次。
如果对象的标识符声明为没有链接且没有存储类说明符static,则该对象具有自动存储持续时间。
5对于这样一个没有可变长度数组类型的对象,它的生存期从进入与它相关联的块开始,一直到该块的执行以任何方式结束。(进入封闭块或调用函数挂起但不结束当前块的执行。)如果递归地进入块,每次都创建一个新的对象示例。2对象的初始值是不确定的。3如果为对象指定了一个初始化,那么在块的执行过程中每次到达声明时都执行初始化;否则,每次到达声明时,该值都变为不确定。
6对于这样一个具有可变长度数组类型的对象,它的生命周期从对象声明开始一直延续到程序执行离开声明的作用域。27)如果作用域是递归进入的,那么每次都会创建一个新的对象示例。对象的初始值是不确定的。

xmq68pz9

xmq68pz93#

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

g2ieeal7

g2ieeal74#

上面的符号是malloc的缩写吗?
不。当你声明一个数组为

T a[N];

你在内存中得到的是这样的:

+---+
a: |   | a[0]
   +---+ 
   |   | a[1]
   +---+ 
   |   | a[2]
   +---+
    ...

除了数组元素本身之外,没有对象a

void foo( void )
{
  T a[N];
  ...
}

这个数组的内存(通常)会和其他局部变量一样从同一个存储器中取出。2当函数退出时,这个内存也会被释放。
将内存分配为

T *a = malloc( sizeof *a * N );

你在内存中得到的是这样的:

+---+         +---+
a: |   | ------> |   | a[0]
   +---+         +---+
                 |   | a[1]
                 +---+
                 |   | a[2]
                 +---+
                  ...
  • 指针变量 * a像任何普通变量一样被分配,一旦函数退出,它就会被销毁,但分配给数组元素的内存不会被销毁--该内存一直保持分配状态,直到显式调用free为止,因此您需要将该指针返回给任何调用函数,或者在退出当前函数之前释放内存。

相关问题