内存分区(堆区、栈区及注意事项)

内存分区(堆区、栈区及注意事项),第1张

内存分区
  1. 运行前

    1. 数据区
      1. data 已初始化的全局变量、静态变量、常量
      2. bss  未初始化的全局变量、静态变量、常量
    2. 代码区
      1. 共享的
      2. 只读的
  2. 运行后
    1. 栈区
      1. 属于先进后出的数据结构
      2. 由编译器管理数据开辟和释放
      3. 变量的生命周期在该函数结束后自动释放掉
    2. 堆区
      1. 容量远远大于栈
      2. 没有先进后出这样的数据结构
      3. 由程序员管理开辟和管理释放
        1. malloc、free
      4. 记住手动开辟的要手动释放
 栈区

 不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限取 *** 作释放后的内存

int * func()
{
	int a = 10;
	return &a;
}

void test01()
{
	int * p = func();

	//结果已经不重要了,因为a的内存已经被释放了,我们没有权限去 *** 作这块内存
	printf("a = %d\n", *p);
	printf("a = %d\n", *p);
}

 

char * getString()
{
	char str[] = "hello world";
	return str;
}

void test02()
{
	char * p = NULL;
	p = getString();
	printf("%s\n", p);
}
堆区
  1. 在堆区开辟的数据,记得手动开辟,手动释放
  2. 注意事项
    1. 如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存
int * getSpace()
{
	int * p = malloc(sizeof(int)* 5);

	if (p == NULL)
	{
		return NULL;
	}

	for (int i = 0; i < 5;i++)
	{
		p[i] = i + 100;
	}
	return p;

}

void test01()
{
	int * p = getSpace();

	for (int i = 0; i < 5;i++)
	{
		printf("%d\n", p[i]);
	}

	//手动在堆区创建的数据,记得手动释放
	free(p);
	p = NULL;
}

 

void allocateSpace( char * pp )
{
	char * temp =  malloc(100);
	if (temp == NULL)
	{
		return;
	}
	memset(temp, 0, 100);
	strcpy(temp, "hello world");
	pp = temp;

}

void test02()
{
	char * p = NULL;
	allocateSpace(p);

	printf("%s\n", p);
}
void allocateSpace2(char ** pp)
{
	char * temp = malloc(100);
	memset(temp, 0, 100);
	strcpy(temp, "hello world");
	*pp = temp;
}

void test03()
{
	char * p = NULL;

	allocateSpace2(&p);

	printf("%s\n", p);

	free(p);
	p = NULL;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/585415.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存