以下 C 代码,一错百分,结贴加分,UP、提问者无分。

Wolf0403 2003-08-18 09:07:56
从以下代码中挑出任何有意义的毛病的英雄,百分酬谢
【小弟没法开 200分帖子,没办法】

// C 程序
#include <stdarg.h>
void FreePtr (int v_cnt, ...)
{
int i = 0;
void ** pTmp;
va_list ap;
va_start(ap, v_cnt);
for (i = 0; i < v_cnt; i++)
{
pTmp = (va_arg(ap, void**));
free(*pTmp);
(*pTmp) = NULL;
}
pTmp = NULL;
va_end(ap);
}
...全文
42 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
newer123 2003-08-19
  • 打赏
  • 举报
回复
如果是数组,会出错
newer123 2003-08-19
  • 打赏
  • 举报
回复
free(*pTmp)错误
改为
free(pTmp)
ransion 2003-08-19
  • 打赏
  • 举报
回复
我也觉得没有必要使用二重指针,而且在free的使用上有问题,我觉的应该是free(pTmp),
可以试试一下的程序,如果使用free(*pTmp)结果有点不同





#include <stdio.h>
#include <windows.h>

#include <stdarg.h>
#include <stdarg.h>
void FreePtr (int v_cnt, ...)
{
int i = 0;
void ** pTmp;
va_list ap;
va_start(ap, v_cnt);
for (i = 0; i < v_cnt; i++)
{
pTmp = (va_arg(ap, void**));
printf("%p\n",pTmp);
printf("%d\n",*pTmp);
if (NULL != pTmp)
{
free(pTmp);//可以换成free(*pTmp)看看
//(*pTmp) = NULL;为了查看使用
}
}
pTmp = NULL;
va_end(ap);
}

int main()
{

int* a=(int*)malloc(1);
int* b=(int*)malloc(1);
int* c=(int*)malloc(1);
*a=1;
*b=2;
*c=3;
printf("a adress %p\n",a);
printf("b adress %p\n",b);
printf("c adress %p\n",c);
printf("%d %d %d\n",*a,*b,*c);
FreePtr (3,a,b,c);
printf("%d %d %d\n",*a,*b,*c);
a=NULL;
b=NULL;
c=NULL;
system("pause");
return 0;
}
请大家指正
sharkhuang 2003-08-19
  • 打赏
  • 举报
回复
找个函数的意思?能拿出这3个参数吗?
newer123 2003-08-19
  • 打赏
  • 举报
回复
free(*pTmp)错误
*pTmp 的内存在栈段,不能用free 释放
grail0922 2003-08-19
  • 打赏
  • 举报
回复

3,在循环体没必要free pTemp;
4,跳出循环

//==============================
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void FreePtr (int v_cnt, ...)
{
int i = 0;
void * pTmp;
va_list ap;
va_start(ap, v_cnt);
for (i = 0;; i++)
{
pTmp = (va_arg(ap, void*));
/*if (NULL != pTmp)
{
free(pTmp);
(pTmp) = NULL;
}*/
if(pTmp==NULL)
break;
}
pTmp = NULL;
va_end(ap);
}

void main()
{
FreePtr(1,2,3);
}
sharkhuang 2003-08-19
  • 打赏
  • 举报
回复
楼上的我跟了跟好像进入if里面只有一次啊!??
不是3此啊
grail0922 2003-08-19
  • 打赏
  • 举报
回复

1,循环条件中的i < v_cnt去掉,取得第一个参数后,v_cnt=1;

2,void ** pTmp 没必要用双重指针

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void FreePtr (int v_cnt, ...)
{
int i = 0;
void * pTmp;
va_list ap;
va_start(ap, v_cnt);
for (i = 0;; i++)
{
pTmp = (va_arg(ap, void**));
if (NULL != pTmp)
{
free(pTmp);
(pTmp) = NULL;
}
}
pTmp = NULL;
va_end(ap);
}

void main()
{
FreePtr(1,2,3);
}
sharkhuang 2003-08-19
  • 打赏
  • 举报
回复
我想问一下你是不是想取出变参数的每个参数!?我也不会,能不能给这段代码?
wbh0360 2003-08-19
  • 打赏
  • 举报
回复
up!!!!!
longenic 2003-08-19
  • 打赏
  • 举报
回复
#include <stdarg.h>
void FreePtr (int v_cnt, ...)
{
int i = 0;
void ** pTmp;
va_list ap;
va_start(ap, v_cnt);
for (i = 0; i < v_cnt; i++)
{
pTmp = (va_arg(ap, void**));
//free(*pTmp);
memset(*pTmp,0,200);
(*pTmp) = 0;
}
pTmp = 0;
va_end(ap) ;
}

这样改在OS:2003, .net下通过
lth_81 2003-08-19
  • 打赏
  • 举报
回复
-_-!!
fwbmail 2003-08-19
  • 打赏
  • 举报
回复
如果参数传入常量会不会有问题
Wolf0403 2003-08-19
  • 打赏
  • 举报
回复
呵呵,16进制不错,从7位变成了8位:)
谢谢了
Wolf0403 2003-08-19
  • 打赏
  • 举报
回复
UP... 还有没有人愿意看看?
ransion 2003-08-19
  • 打赏
  • 举报
回复
我不知道你的函数是这种传入方式,如果这样的话就没有问题

不过输出地址的话可以用%p,你可以试试看printf("%p\t%p\t",p1, p2),只不过结果是16进制的(可以省点空间)
davidwoo 2003-08-19
  • 打赏
  • 举报
回复
up
huiqi2001 2003-08-19
  • 打赏
  • 举报
回复
UP
Wolf0403 2003-08-19
  • 打赏
  • 举报
回复
西方失败:
你的代码根本没有将传入的指针置为 NULL,也就是说只完成了一半任务:)
另外,打印一个指针的地址应该是 %d 而不是 %p。 %p 是基于实现的输出指针值,而不是指针地址,因此 printf("%p 打印的并不是我要的结果。
____________________________________________________
newer123:
请参考我的调试程序。给 FreePtr 传入的不定参数都是指针的地址,因此用于接受的必须是一个指向指针的指针,也就是一个 void**。如果我直接给 FreePtr 传入指针,然后用 void* pTmp 来接受、处理,则我虽然可以释放传入指针指向的地址(用 free(pTmp)),却无法将传入指针指向的地址改为 NULL。
____________________________________________________
longenic(江寒):
memset(*pTmp,0,200); 是把 *pTmp 作为一个字符数组处理,将 *pTmp 指向的前 200 个字节替换为 0,并不是释放内存。free(void*) 将内存释放并提交给系统,这才是释放内存的合理方法。
_____________________________________________________


我的调试程序:
int main(){
char * p1 = (char *)malloc(1024);
char * p2 = (char *)malloc(1024);
FreePtr(2, &p1, &p2);
printf("%d\t%d\t", p1, p2);
system("PAUSE");
}
Wolf0403 2003-08-19
  • 打赏
  • 举报
回复
各位大仙,我这个函数的目的是通过传入指针的个数和需要释放的指针的地址,一次性释放所有指针并将所有指针置为 NULL。所以 pTmp 指向的是我传入的指针, *pTmp 指向的才是我需要释放的内存。因为释放后需要将传入的指针置为 NULL,因此必须用二次指针,否则无法改正传入指针的值。
对于传入常量、数组的,是使用者的责任,不归我的函数处理。
加载更多回复(9)

69,371

社区成员

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

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