[英]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指向的数据时,仍会在地址处打印值,因为该内存已添加到空闲列表中而不被删除。
如何释放刚分配的内存?
你可以做这样的事情
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);
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.