发布网友 发布时间:2022-06-01 15:00
共2个回答
热心网友 时间:2024-07-22 17:39
因为主函数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里就报错。编译器问题?可能吧,这个我到没注意过热心网友 时间:2024-07-22 17:36
str = (int *)malloc(inputLen);