回顾内存区:C语言C++的内存区是一样的。

◎回顾内存区:C语言C++的内存区是一样的。
共五个区:栈区,堆区,全局区,代码区,文字常量区

把握内存的开辟时间和销毁时间,就能掌握这五个区的要点

 

编辑    ==》    编译    ==》    连接    ==》    运行

敲代码          语法检查         库文件

#栈区statck

运行到时开辟,所在函数结束(即作用域结束)时销毁

如:

void foo(int arg)

{

int LocalVar;

if  (100 == arg )

{

int var;

}

}

实际上代码为

void foo(auto int arg)

{

auto int LocalVar;

if  (100 == arg )

{

auto int var;

}

}

因为auto一般都是不用写的。只有形式参数和局部变量可以定义为auto变量。全局变量之前不能加auto,编译器也不会自动给全局变量加auto

arg,LocalVal,var都在栈区,局部变量

内存不由程序员回收,由编译器自动回收。

 

#堆区heap

调用malloccalloc时开辟,free()时销毁,堆区的内存必须手动回收。

int main()

{

int* p = (int*)malloc;//p在栈区,但是p所指向的内存是堆区

free(p);

return 0;

}

C++中用newdelete

 

#全局区

编译时(main函数执行之前)开辟,并自动初始化。main()函数结束时销毁。在函数内部定义时,在变量类型前加static关键字。

int foo()

{

static int var;

var++;

}

 

int main()

{

foo();

foo();

return 0;

}

foo()函数执行时不会执行static int var;这条语句。因为它是在编译时执行的。

全局变量无论前面是否加static都是在全局区的。

全局变量之前加static变量和不加static变量有什么区别?通过使用编译器写测试代码查看区别:

作用域不同,加了static后,全局变量的作用域限定在本文件内部,不允许使用extern关键字扩展到其他文件内部。但是没加static的全局变量可以被扩展到其他文件。

extern只能用于扩展非静态的全局变量。

#代码区

函数本身是在代码区。

 

void foo(void)

{

}

int main(void)

{

void (*pFn)() = foo;//foo是地址常量

foo();

pFn();

printf("%x\n",foo);

 

return 0;

 

}

 

 

#文字常量区

字面值在文字常量区。

int foo()

{

printf("%d",100);

}

 

int foo()

{

printf("%d",100);//100在文字常量区

char arr[] = "boy";//boy在栈区

char*p = "girl";//girl在文字常量区

//*p = 'h';//错误,文字常量区不能改写内容,运行时才报错“该内存不能写”

arr[0] = 'm';//可以修改,因为在栈区

*arr = 'k';

}

 

总结:栈的大小小的多;堆区的内存多的多,而且可以使用虚拟内存,会调用硬盘存储。除了文字常量区的内存不能写之外,其他内存区都可以写。

原文链接: https://www.cnblogs.com/hanxi/archive/2012/08/03/2622253.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    回顾内存区:C语言C++的内存区是一样的。

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/57731

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午8:24
下一篇 2023年2月9日 上午8:24

相关推荐