繁体   English   中英

在C中为一维数组分配内存

[英]Allocating memory for one dimensional array in C

我对创建动态数组有疑问。

int *p; 
p = malloc( 3 * sizeof( int ) );

// initializes elements in the array
for ( int i = 0; i < 3; ++i ) {
    *p++ = i * 4;
}

如何释放刚分配的内存? 由于某种原因,我发现解除二维数组的分配比一个LOL容易得多。 自从我上次使用C以来已经有一段时间了。

如果我执行以下操作:

free( p ); // will probably get an error. 

关于指针的另一件事。 我尝试了这个:

int * p = malloc( sizeof( int ) );
*p = 4;

printf( "%d\n", *p ) // prints 4 as expected

free( p );
printf( "%d\n", *p ) // still prints the number 4!!!

释放功能应释放p指向的内存块。 然后printf仍然打印4张照片?

Malloc()返回一个指向已分配块的指针。 使用free()保留它以备将来使用。 用整数索引数组,或使用指针遍历数组,但将原始地址保存在某处。

你可以这样

int *p = malloc(3 * sizeof(int));
for( int i = 0; i < 3; i++)
   p[i] = 4*i;
// .....
free(p);

要么

int *p = malloc(3 * sizeof(int));
int *q = p;
for( int i = 0; i < 3; i++)
   *q++ = 4*i;
// .....
free(p);

在第一种情况下,您只写了free(p)因为您只分配了一块内存。

在第二种情况下,您正在做的事情是不确定的行为。 它可能会打印4,可能会崩溃,它实际上可以执行任何操作。 可能是该实现只是将该位置标记为可重用,但实际上并未清除该位置(为什么要浪费时间)

free(p) de分配p指向的内存。 但是p仍然具有由free(p)分配的内存地址。 取消分配是指将内存块添加到空闲内存列表中,由内存分配模块维护。 当您打印由p指向的数据时,仍会在地址处打印值,因为该内存已添加到空闲列表中而不被删除。

  1. 如何释放刚分配的内存?

    你可以做这样的事情

     int *p; p = malloc( 3 * sizeof( int ) ); // initializes elements in the array for ( int i = 0; i < 3; ++i ) { p[i] = i * 4; } 

    这不会更改p ,因此您可以使用free(p)释放它。

    如果需要更改p ,则应记住其在另一个变量中的原始值,并对该原始值调用free() ,例如

     int *op; op = p; /* do something that changes `p` */ free(op); 
  2. printf静止图像如何打印4

    在释放动态访问的内存区域后,所做的操作将导致未定义的行为。 它可能会打印4 ,也可能崩溃或执行某些真正荒唐的事情。

如何释放刚分配的内存?

当我们想要释放先前由malloc()分配的内存块时,我们使用free函数。 此函数接受指向先前分配的内存块的char指针,并释放它-即,将其添加到可能重新分配的空闲内存块列表中。 使用free(p)

然后printf仍然打印4张照片?

free()用法

关于free()几点说明:

  • 块的大小先前由malloc()存储在其内存映射中,这就是free()如何知道要释放多少字节的方式。
  • 释放的内存不会以任何方式清除或擦除。 这就是为什么访问刚刚释放的内存通常不会导致崩溃的原因-内存中的任何数据仍然与调用free()之前的数据相同
  • free()函数不能使指向仍可能存在于我们程序中的给定内存块的指针无效。 在调用free() ,我们(程序员)应该决定不要尝试取消对仍然指向该内存块的指针的引用 这样的指针称为“悬挂指针”-它们指向已经释放的内存,因此,除非为其分配了不同(未释放)内存块的地址,否则它们不应再次被取消引用。

在第一种情况下,您仍然可以通过将指针移回第一个元素的地址,然后调用free(p)来释放内存,如下所示:

p = p-3;
free(p);

原因 :malloc存储一些有关动态分配后需要释放多少内存的信息,这就是为什么您需要将其指向起点,以便free可以读取该信息并准确释放malloc分配的3个int内存。

在第二种情况下,仍然打印不是通用结果,即使程序可能崩溃,输出也可以是任何东西。

原因 :free对内存不做任何特殊处理,它仅将其添加回它维护的FREE LIST中,以供动态分配的内存使用。 完全由程序员决定,他们在对free调用之后不取消引用。

Malloc ==>仅分配内存(不将内存数据更改为NULL)

Free ==> Only它将释放指针上分配的资源(不将内存数据更改为NULL)

在这两种情况下,用户都可以根据需要负责地设置适当的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM