读书人

C语言疑义

发布时间: 2014-01-12 00:03:16 作者: rapoo

C语言疑问
程序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,上述两种做法会不会有什么不妥?怎样修改?恳请指点。
[解决办法]
free之后把point和p都置为NULL。

引用:
point是char*变量,我打错了。
两个指针都是指向一块动态内存,free(point)和free(p)不是一样吗?
第二个程序有什么好的替代方法吗?因为有时候的确有这样的逻辑

Quote: 引用:

1、第一种没有问题;
2、第二种不行,point只是一个char变量而已,即便point是char*指针,也会有隐患,因为会导致p成为野指针。

Quote: 引用:

程序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,上述两种做法会不会有什么不妥?怎样修改?恳请指点。

[解决办法]
从技术层面和正确性方面,是没有问题的,但从软件工程角度,问题就比较大,说得直白一点,这种代码难于维护。

一般来说,除非非常有必要,否则是不会讲malloc()和free()脱离函数上下文,即便放在不同的函数,也一般用

明显的函数包装,比如resInit() resDelete()。

另外,搞不懂什么场景下需要pointer=p;这种操作。调用一个函数就可以在函数中定义形参了,为什么还要维护一个指针的多个副本?
[解决办法]
引用:
point是char*变量,我打错了。
两个指针都是指向一块动态内存,free(point)和free(p)不是一样吗?
第二个程序有什么好的替代方法吗?因为有时候的确有这样的逻辑

Quote: 引用:

1、第一种没有问题;
2、第二种不行,point只是一个char变量而已,即便point是char*指针,也会有隐患,因为会导致p成为野指针。

Quote: 引用:

程序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,上述两种做法会不会有什么不妥?怎样修改?恳请指点。


那就完成没有什么问题了!释放后置NULL比较好一点吧!是一个好的编程习惯
另外p和point指向同一块内存,释放的时候只有一个释放就好!所以释放前判断不为NULL再释放比较好一点!
[解决办法]
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;
}


[解决办法]
用c就是要养成好习惯也严谨的编码态度,遵循一定的编码和设计规范。
如果是c++,可以用shared_ptr来代替。减少不必要的人为失误

读书人网 >C语言

热点推荐