-
运行前
- 数据区
- data 已初始化的全局变量、静态变量、常量
- bss 未初始化的全局变量、静态变量、常量
- 代码区
- 共享的
- 只读的
- 数据区
- 运行后
- 栈区
- 属于先进后出的数据结构
- 由编译器管理数据开辟和释放
- 变量的生命周期在该函数结束后自动释放掉
- 堆区
- 容量远远大于栈
- 没有先进后出这样的数据结构
- 由程序员管理开辟和管理释放
- malloc、free
- 记住手动开辟的要手动释放
- 栈区
不要返回局部变量的地址,因为局部变量在函数执行之后就释放了,我们没有权限取 *** 作释放后的内存
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);
}
堆区
- 在堆区开辟的数据,记得手动开辟,手动释放
- 注意事项
- 如果在主调函数中没有给指针分配内存,那么被调函数中需要利用高级指针给主调函数中指针分配内存
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;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)