user-0 提问: C语言疑问

回复:
user: user-1
content: 引用 2 楼 baoyuan24 的回复:point是char*变量，我打错了。 两个指针都是指向一块动态内存，free(point)和free(p)不是一样吗？ 第二个程序有什么好的替代方法吗？因为有时候的确有这样的逻辑  [quote=引用 1 楼 turingo 的回复:] 1、第一种没有问题； 2、第二种不行，point只是一个char变量而已，即便point是char*指针，也会有隐患，因为会导致p成为野指针。  [quote=引用 楼主 baoyuan24 的回复:] 程序1： #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char**point) {     *point = malloc(5);     ASSERT(*point != NULL); } int main() {     char* p;     fun(&p);     free(p);     return 0; } 程序2： #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {     char* p, point;     p = malloc(5);     ASSERT(p != NULL);     point = p;     free(point);     return 0; } 问题： 程序1中从被调函数中分配的内存，在主调函数中释放； 程序2中两个指针指向同一内存，释放point而不是p，上述两种做法会不会有什么不妥？怎样修改？恳请指点。[/quote][/quote]  那就完成没有什么问题了！释放后置NULL比较好一点吧！是一个好的编程习惯 另外p和point指向同一块内存，释放的时候只有一个释放就好！所以释放前判断不为NULL再释放比较好一点！

user: user-2
content: 从技术层面和正确性方面，是没有问题的，但从软件工程角度，问题就比较大，说得直白一点，这种代码难于维护。  一般来说，除非非常有必要，否则是不会讲malloc()和free()脱离函数上下文，即便放在不同的函数，也一般用  明显的函数包装，比如resInit() resDelete()。  另外，搞不懂什么场景下需要pointer=p;这种操作。调用一个函数就可以在函数中定义形参了，为什么还要维护一个指针的多个副本？

user: user-3
content: free之后把point和p都置为NULL。  引用 2 楼 baoyuan24 的回复:point是char*变量，我打错了。 两个指针都是指向一块动态内存，free(point)和free(p)不是一样吗？ 第二个程序有什么好的替代方法吗？因为有时候的确有这样的逻辑  [quote=引用 1 楼 turingo 的回复:] 1、第一种没有问题； 2、第二种不行，point只是一个char变量而已，即便point是char*指针，也会有隐患，因为会导致p成为野指针。  [quote=引用 楼主 baoyuan24 的回复:] 程序1： #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char**point) {     *point = malloc(5);     ASSERT(*point != NULL); } int main() {     char* p;     fun(&p);     free(p);     return 0; } 程序2： #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {     char* p, point;     p = malloc(5);     ASSERT(p != NULL);     point = p;     free(point);     return 0; } 问题： 程序1中从被调函数中分配的内存，在主调函数中释放； 程序2中两个指针指向同一内存，释放point而不是p，上述两种做法会不会有什么不妥？怎样修改？恳请指点。[/quote][/quote]

user: user-0
content: point是char*变量，我打错了。 两个指针都是指向一块动态内存，free(point)和free(p)不是一样吗？ 第二个程序有什么好的替代方法吗？因为有时候的确有这样的逻辑 引用 1 楼 turingo 的回复:1、第一种没有问题； 2、第二种不行，point只是一个char变量而已，即便point是char*指针，也会有隐患，因为会导致p成为野指针。  [quote=引用 楼主 baoyuan24 的回复:] 程序1： #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char**point) {     *point = malloc(5);     ASSERT(*point != NULL); } int main() {     char* p;     fun(&p);     free(p);     return 0; } 程序2： #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {     char* p, point;     p = malloc(5);     ASSERT(p != NULL);     point = p;     free(point);     return 0; } 问题： 程序1中从被调函数中分配的内存，在主调函数中释放； 程序2中两个指针指向同一内存，释放point而不是p，上述两种做法会不会有什么不妥？怎样修改？恳请指点。[/quote]

user: user-3
content: 1、第一种没有问题； 2、第二种不行，point只是一个char变量而已，即便point是char*指针，也会有隐患，因为会导致p成为野指针。  引用 楼主 baoyuan24 的回复:程序1： #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char**point) {     *point = malloc(5);     ASSERT(*point != NULL); } int main() {     char* p;     fun(&p);     free(p);     return 0; } 程序2： #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {     char* p, point;     p = malloc(5);     ASSERT(p != NULL);     point = p;     free(point);     return 0; } 问题： 程序1中从被调函数中分配的内存，在主调函数中释放； 程序2中两个指针指向同一内存，释放point而不是p，上述两种做法会不会有什么不妥？怎样修改？恳请指点。

user: user-4
content: no problem

user: user-5
content: 用c就是要养成好习惯也严谨的编码态度，遵循一定的编码和设计规范。 如果是c++，可以用shared_ptr来代替。减少不必要的人为失误

user: user-6
content: char* p, point;  --〉 char *p; char *point;  两个代码都行的通。第一个这么会好些： void fun(char**point) {     ASSERT(*point != NULL); } int main() {     char* p;     *p = malloc(5); //这样比较好， 与下面的free对应上     fun(&p);     free(p);        //     return 0; }