【计算机基础】动态内存

53 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

malloc的用法

image.png

翻译出来的大概意思就是在内存当中申请一块连续可用的空间,返回这块空间的指针 如果开辟成功,则返回一个指向已经开辟空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void ,所以malloc函数并不知道开辟空间的类型,具体在使用的过程中,由使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器,这里我们写一个代码看看基本使用。

int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 4);
	if (ptr == NULL)
	{
		return 1;
	}
	else
	{
		for (int i = 0; i < 4; i++)
		{
			ptr[i] = i;
			printf("%d ", ptr[i]);
		}
	}
	free(ptr);
	ptr = NULL;
	return 0;
}

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cc48c9024cba4c89ba505e119c26a26a~tplv-k3u1fbpfcp-watermark.image?)

注意:使用完一定要记得释放否则就造成内存泄漏。ptr在free之后仍然指向开辟的空间,但开辟的空间已经还回去了,所以我们要手动置成NULL,否则会影响下次的使用。

calloc的用法

image.png 这里可以看出参数size_t num为我们要的元素数量,size_t size为每个元素的大小,我们也写一段简单的代码

int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr == NULL)
	{
		return 1;
	}
	else
	{
		for (int i = 0; i < 4; i++)
		{
			ptr[i] = i;
			printf("%d ", ptr[i]);
		}
	}
	
	free(ptr);
	ptr=NULL;
	return 0;
}

再次注意://使用完一定要记得释放否则就造成内存泄漏。ptr在free之后仍然指向开辟的空间,但开辟的空间已经还回去了,所以我们要手动置成NULL;

calloc开辟出来的空间也是在堆区上,同然使用完之后要对内存进行释放,同理也要判断是否能开出了来,并置成NULL。

这里再给大家一个举一个开辟失败的例子

image.png 这里我在开2g内存的时候ptr返回NULL,如果这里我们没有对返回值做判断,使用的话就会造成错误,当然,想要开出2g或4g空间,只需要把x86改成64位就可以开辟出来了。

realloc

image.png

其中参数ptr是要调整的内存地址,size为调整之后的大小,注意,realloc有两种情况
第一种:原空间后面有足够大的空间
第二种:原空间后面没有足够大的空间

第一种:假设我们想要扩容一点,或者缩小空间,realloc帮我们处理好返回的依旧是处理前的地址,说明原空间后面有足够大的空间。

第二种:当我们开辟新的空间内存时,有可能因为后面空间不够,这个时候他会去另外一个地方找一块足够的空间,再将原来的内容拷贝过去,并且帮我们释放原来的空间,返回新开的空间的地址,说明原空间后面没有足够大的空间。

free的用法

image.png 调用形式:free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

int main()
{
    struct stu
    {
      int num;
      char *name;
      char sex;
      float score;
    }  *ps;

    ps=(struct stu*)malloc(sizeof(struct stu));
    ps->num=102;
    ps->name="Zhang ping";
    ps->sex='M';
    ps->score=62.5;
    printf("Number=%d Name=%s ",ps->num,ps->name);
    printf("sex=%c Score=%f ",ps->sex,ps->score);
    free(ps);
}