1、system函数:原型:int system(const char * command);功能:执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名说明:在windows系统中,system函数直接在控制台调用一个command命令。在Linux/Unix系统中,system函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程;头文件:stdlib.h;返回值:命令执行成功返回0,执行失败返回-1。2、例程:
123456#include<stdio.h>#include<stdlib.h>int main(){system("pause")//暂停return 0}
因为主函数pmonth和pday所指内存的值是由函数month_day函数计算得出,得出的值k和yearday的再拷贝给这两个指针所指内存,我们知道函数内部变量的k和yearday实际上是存储在栈区,函数返回后,k和yearday所用内存将会被回收。所以通过给pmonth和pday所指内存分配堆区内存,然后将k和yearday的值保存在堆区,以便函数返回后依然能够使用k和yearday的值。正常情况下,申请多少,释放多少 。C/C++只会知道申请的内存量,不会知道你申请后实际访问的内存量。在这里,你实际使用超过了你申请的内存,这就意味着你的程序访问了不该使用的内存,这是一个严重的BUG,有个专用名词叫:“内存越界”。越界访问的这些内存,尤其是写入访问,可能导致未知的后果(因为很难预料越界访问的这块内存是干马用的): 1) 有可能它只是空闲内存,没有任何用处,这时你的程序就没有症状,运行良好; 2) 有可能是其它程序模块的数据区,这样,可能会在程序运行一段时间之后,其它模块因为其数据被莫名的改变而出现莫名的故障3) 也有可能这块内存是一段程序的机器代码或者是 *** 作系统禁止访问的区域,这样就会导致程序崩溃(Crash)。malloc()分配的内存块其实是隐藏有一定的数据结构的,你越界访问导致破坏了这块描述内存块分配情况的数据结构,因此在free时可能会报错(实际是这就是上面说是第2种情况)。应该说这种情况还算是幸运的,有的时候时候 ,越界破坏的内存是一块效少使用的数据,这样,就会导致程序在运行了很久后在别的模块中出现莫名其妙的问题,这将使得排错异常困难。因此,用C/C++时进行内存(指针)访问,一定要特别小心,养成良好的习惯,否则可能将给你今后的编程生涯带来很多的麻烦。1、指针非法,比如使用没有初始化的指针(没有为此指针指向的对象分配空间),或着Free掉之后再次使用。3、缓存溢出,对于这种while{do}的程序,这个问题最容易发生,多此sprintf或着strcat有可能将某个buff填满,溢出,所以每次使用前,最好memset一下,不过要是一开始就是段错误,而不是运行了一会儿出现的,这种情况的可能性就比较小。malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。强转一下果然可以了。可是为什么之前在eclipse里写没事,在vs2012里就报错。编译器问题?可能吧,这个我到没注意过malloc多数情况是不会分配失败的,如果是windows 32bit程序每个程序的虚拟地址空间有2G,很难出现失败的情况如果是一些嵌入式程序的话,内存不大,并且内存是自己管理的,碎片太多而且不连续的话,就分配失败了
至于如何处理,要看程序所处的位置,如果是比较核心的位置,内存低就强制释放其他低优先级的内存,供此处使用,如果不太重要的位置,可以提示信息,说内存低,程序返回(return)即可,还有可以记录下异常日志,便于查找哪边分配失败
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)