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

时间:2014-03-28 10:20:14

标签: 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!!!

free函数应释放p指向的内存块。那个printf剧照怎么打印4呢?

7 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:1)

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

您在第二种情况下所做的是未定义的行为。它可能打印4,它可能会崩溃,它可以做任何事情。可能的情况是,实施只是将该位置标记为可重复使用,但实际上并未将其清除(为什么要这样做,这是浪费时间)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  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,它也可能崩溃或做一些非常狂野的事情。

答案 4 :(得分:0)

  

我如何释放我刚刚分配的内存?

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

  

那怎么样printf剧照打印4呢?

Usage Of free()

  

关于free()的几点说明:

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

答案 5 :(得分:0)

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

p = p-3;
free(p);

原因:malloc存储了一些关于动态分配后需要释放多少内存的信息,这就是为什么你需要将它指回到开始状态以便free可以读取该信息和正好释放了malloc分配的3个int内存。

在你的第二种情况下,它仍然是打印不是普遍的结果,输出可以是任何甚至程序可能崩溃。

原因:free对内存不做任何特殊操作只会将其添加回为动态分配可用内存维护的FREE LIST。 只有程序员才能在免费调用之后取消引用它。

答案 6 :(得分:0)

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

免费==&gt;只有它会释放指针上的已分配资源(不会将内存数据更改为NULL)

在这两种情况下,如果需要,用户负责任地设置适当的值。