C语言疑问

常如意 2014-01-09 09:31:15
程序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,上述两种做法会不会有什么不妥?怎样修改?恳请指点。
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2014-01-09
  • 打赏
  • 举报
回复
引用 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再释放比较好一点!
YTerrenceLau 2014-01-09
  • 打赏
  • 举报
回复
从技术层面和正确性方面,是没有问题的,但从软件工程角度,问题就比较大,说得直白一点,这种代码难于维护。 一般来说,除非非常有必要,否则是不会讲malloc()和free()脱离函数上下文,即便放在不同的函数,也一般用 明显的函数包装,比如resInit() resDelete()。 另外,搞不懂什么场景下需要pointer=p;这种操作。调用一个函数就可以在函数中定义形参了,为什么还要维护一个指针的多个副本?
图灵狗 2014-01-09
  • 打赏
  • 举报
回复
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]
常如意 2014-01-09
  • 打赏
  • 举报
回复
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]
图灵狗 2014-01-09
  • 打赏
  • 举报
回复
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,上述两种做法会不会有什么不妥?怎样修改?恳请指点。
buyong 2014-01-09
  • 打赏
  • 举报
回复
no problem
「已注销」 2014-01-09
  • 打赏
  • 举报
回复
用c就是要养成好习惯也严谨的编码态度,遵循一定的编码和设计规范。 如果是c++,可以用shared_ptr来代替。减少不必要的人为失误
Binzo 2014-01-09
  • 打赏
  • 举报
回复
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;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧