本帖最后由 chenhai 于 2016-2-19 23:00 编辑
是这样的,如果你的g()里面没有free(q)这条语句,那么该程序只是修改了指针p所指向堆内存里的int值,这样输出的结果就是10...2000...这是没有问题的,就算要free,也应该在main函数里的return语句前free,而不是在g()里面做free这个动作,因为你在g()里面给*p赋了值,紧跟着就把P给释放了,也就是把该指针所指向的内存块释放了,那么请问,你又何必做赋值这个动作呢?同时调用完g()后,你又想获得该指针变量所指向的内存值,这是个很危险的动作,因为在main函数中此时该指针并没有失效,此时所指向的内存地址是随机的,一旦你想通过该地址获取数据,会是不确定的,也就是说你每次执行的时候该指针的地址值随机分配,那么对应的内存输出的值当然也是随机了,可以运行那是你正好访问到了可以访问的内存,,,,,,,,,万一访问到系统地址,则宕机了.....你可以随机输出试试,,,,,,有可能10次都不宕机,但是每次值都不一样,也有可能一次就宕机了,,,,,,,对于用指针来做分配和free,我建议是哪里分配,哪里free,,,尽量不要跨函数free,,,,,这样容易带来管理上的不便........希望可以解答你的疑问. 最后我再补充一点,局部变量的生命周期是随着{}消失而消失的,你在main函数里面定义的变量只有在程序退出时才会消失,你初始化该变量,该变量就是你初始化的值,你不初始化并不意味着该变量没有值,系统会随机分配值给该变量,只是没有显示出来,就拿你上面的程序来说,你就算free了指针P,你不要以为这个指针变量就没有值了,它就消失了,拜托,,,,,它一样有值的,你free的不过是该指针指向的内存空间,不信你可以在free(p),这句代码后面执行printf("%d\n", p);你看看p有没有值,切记是p,而不是*p,,,,,并且每次输出的值会不一样.危险的存在哦,,,,,,,,正确的做法就是一旦该指针不使用了,记得赋值为NULL哦,,,,,,空指针还稍微好点.......
|