C语言中的远指针是什么
可以访问 RAM 的所有 16 个段(整个驻留内存)的指针称为远指针。 远指针是一个 32 位指针,它在给定节中获取内存之外的信息
什么是静态函数
在C语言中,默认情况下函数是全局的。函数名称前的“ static”关键字使其变为静态。与C中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想限制对函数的访问时,我们将它们设为静态。使函数成为静态的另一个原因可能是在其他文件中重用了相同的函数名。
++a和a++的区别是什么
加加a的意思是先加后取值。A加加的意思是先取值后增加。
c/c++的内存分配,详细说一下栈、堆、静态存储区
栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等
其操作方式类似于数据结构中的栈。
堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放。
程序代码区 —存放函数体的二进制代码。
C语言中的悬空指针是什么
如果一个指针指向任何内存位置,但同时另一个指针删除了第一个指针占用的内存,而第一个指针仍然指向该内存位置,则第一个指针将被称为悬空指针。 这个问题被称为悬空指针问题。当一个对象被删除而不修改指针的值时,就会出现悬空指针。 指针指向释放的内存。
如何克服悬空指针的问题
可以通过将 NULL 值分配给悬空指针来克服悬空指针的问题
C语言中指针的指针是什么
指针的指针概念:一个指针指的是另一个指针的地址。 指向指针的指针是一个指针链。 通常,指针包含变量的地址。 指向指针的指针包含第一个指针的地址。
单等号和双等号的区别是什么
单等号表示赋值运算符。双等号是等于条件判断运算符。
堆与栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。 注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
本文介绍了C语言中的远指针、静态函数、指针操作及内存分配的区别,如栈、堆和静态存储区。还探讨了悬空指针问题及其解决方案,并解析了指针的指针概念。此外,文章阐述了单等号和双等号的差异,以及堆和栈在管理方式、空间大小、碎片问题和生长方向上的不同。
3725

被折叠的 条评论
为什么被折叠?



