C/C++函数、变量和指针

动态内存分配是指在程序运行时为程序中的变量分配内存空间,其完全由应用程序自己进行内存的分配和回收。然后内存分配方式并不是唯一的,内存分配方式包括以下3中:

1.从静态存储区域分配内存

程序在编译时就已经把该程序所占用的内存分配好了,并且该内存在整个程序的运行过程中一直是有效的,例如存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统自动释放该内存。

2.在堆栈上分配

在函数执行的这段时间,函数内部的局部变量的存储单元都创建在堆栈上,函数结束时存储单元被自动释放。

在堆栈上分配内存的缺点是堆栈内存分配运算内置于处理器的指令集中,效率高,并且一般不会存在失败的危险。但分配的内存容量有限,可能会发生堆栈溢出的情况。

在堆栈上分配内存的优点是在堆栈中分配内存可以避免或减少内存碎片的产生。

3.动态内存分配

动态数据区一般就是“堆”和“栈”,并且“堆”和“栈”是两种不同的动态数据区。

栈(stack)是一种线性结构。由编译器自动分配释放。栈是用来存放函数的参数值、局部变量、本地变量的值等。其操作方式类似于数据结构中的栈。

堆(heap)是一种链式结构。一般由程序员分配释放,否则会造成内存泄露。注意它与数据结构中的堆是两个完全不同的概念。

以上是内存的分配方式。

C/C++通常可以把内存理解成4个分区:栈、堆、全局/静态存储区以及常量存储区。

时间: 2024-10-05 02:05:23

C/C++函数、变量和指针的相关文章

辨析函数指针变量和指针型函数

在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是: Status (*compare)(Elemtype e,Elemtype temp); 这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别. 一.写法上的区别 函数指针变量 指针型函数 int (*function)(int i); int  *function(int i){} 上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两

函数返回局部指针变量是否可行?

我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量.为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能够返回其地址?静态变量与局部自动变量的主要区别是什 么? 要想明白这些就需要理解程序的内存布局情况 程序的存储区域分为:代码段.只读数据段.已初始化的读写数据段.未初始化的数据段.堆.栈. 1.代码段.只读数据段.已初始化的读写数据段.未初始化的数据段都属于静态区域

指向结构体变量的指针作函数参数

 /********************* * 指向结构体变量的指针作函数参数 * ***********************/ #include<stdio.h> #include<string.h> struct student {  int num;  char name[20];  //char *name;    //若定义为指针则应与下面 stu.name = "jacob"; 配对使用,交叉使用则会报错                 //

探究javascript对象和数组的异同,及函数变量缓存技巧

javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来存储数据有什么不同.于是,我打算探究探究. 一.掌握三种数据类型 首先,一个前提必须掌握的,就是必须理解javascript的数据类型分类,主要分为以下三种: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二

数组变量和指针的关系

老师说数组变量可以被看作是const的指针变量,到底是"可以被看作",还是"就是"指针呢? 用程序证据来说明你的观点. (提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针:如果有某个操作不能做,或者结果不一致,就说明不是指针) #include <stdio.h> int main(){ int a[] = {1,1,2,3,4,5,6,7,8,9,0,}; int *const p = &a[0];

C语言 指向结构体变量的指针

一个指向变量的指针表示的是占内存中起始位置 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组 定义结构体变量的指针: //假设已有一个结构体名为Student struct Student *pStruct // 结构体类型 * 指针名; 通过指针来引用结构体中的成员,有三种方式 demo: 1 # include <stdio.h> 2 # include <stdlib.h> 3 /* 4 1.使用->引用结构体成员 5

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了 看个例子: #includ

(转)const变量通过指针修改问题

程序笔试题-const变量通过指针修改问题 2012-10-06 20:45:18 分类: C/C++ const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1 不能修改的情况 #include <stdio.h>int const a = 10;void main(void){ int *p = (int*)&a; *p = 20; printf("%d\n", *p);} 程序编译通过,但运行时错误: 指示

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

调用函数时传指针注意问题

指针是C/C++的强大工具,但也是最容易出错的地方. C++在函数调用时支持三种方式:赋值传递,引用传递,指针传递. 1.赋值传递是在函数调用栈内创建临时对象,并将实参对象复制到临时对象,函数内部只能操作实参对象的副本.这种方式对于基本类型倒无所谓,但是对于庞大的类对象,则会带来很大的调用代价. 2.引用传递是通过实参对象的别名来引用实参对象,并不将实参对象进行拷贝,函数内部可以直接操作实参对象,因此它的优点是高效,适合传递大型对象,同时这种方式也可以用作从函数返回数据的方式,它的缺点就是实参对