如何判断一个指针是无效 或者 错误的指针,如何捕获这样的异常?

chinawcs 2008-10-06 09:35:36
假如
char *s2;
s2=(char*)rr->comp->u.simple->u.generic(该项取值可以为 none, B, F三项)

b或者f 赋值后 s2都是正确指针 可默认值none 却报错说 s2 无效的指针 程序就退出了

望指点!tks
...全文
933 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
bopizi 2009-01-05
  • 打赏
  • 举报
回复
try
{

}
catch(...)这里不晓得什么类型可用三点
{
}
chinawcs 2008-10-07
  • 打赏
  • 举报
回复
问题是 赋值 有可能采用默认值 none 也就是结构体 没有分配指针 服务器端 要始终获得 该参数

中间的处理 不是咱们能该的没有原代码
deh_1984 2008-10-07
  • 打赏
  • 举报
回复
none 是不是NULL呢?

如果是,那么在给指针赋值后加以判定,是否为null,是那么做你想做的事情,不是亦然。

如果不是为NULL,那么你要先单步调,看赋值的是啥值,然后按这个值判定。
chinawcs 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 stivenjia 的回复:]
C/C++ code
__try
{

}
__excpet(EXCEPTION_EXECUTE_HANDLER)
{

}



试一下SEH
[/Quote]


这个可以 可当我 在用到其它代码上捕捉错误时 编译不过去

_try
{
authtype=q->auth->which;
}
_except(EXCEPTION_EXECUTE_HANDLER)
{
authtype=3;

}


编译出错
Cannot use __try in functions that require object unwinding

网上搜索了 说 Compile without /EHsc

可俺不太懂 ehsc

chinawcs 2008-10-06
  • 打赏
  • 举报
回复
首先谢谢大家的 关注与帮忙

因为刚接触c++ 所以我把代码贴出来 怕我说不清楚
3个结构体如下

typedef struct {
char *setname; /* set name */
int start;
int number; /* record number */
oid_value format; /* One of the CLASS_RECSYN members */
Z_ReferenceId *referenceId;/* reference ID */
Z_RecordComposition *comp; /* Formatting instructions */
ODR stream; /* encoding stream - memory source if required */
ODR print; /* printing stream */
bend_request request;
bend_association association;

int hits; /* number of hits */
int errcode; /* 0==OK */
char *errstring; /* system error string or NULL */
} bend_present_rr;

struct Z_RecordComposition {
int which;
union {
Z_ElementSetNames *simple;
Z_CompSpec *complex;
#define Z_RecordComp_simple 1
#define Z_RecordComp_complex 2
} u;
};

struct Z_ElementSetNames {
int which;
union {
Z_InternationalString *generic; //默认值为none 取值可以是 "B" "F"
Z_DatabaseSpecific *databaseSpecific;
#define Z_ElementSetNames_generic 1
#define Z_ElementSetNames_databaseSpecific 2
} u;
};




客户端程序赋值(vb代码) zc.SetOption "elementSetName", "F"

服务器端 获取参数

int ztest_present (void *handle, bend_present_rr *rr)

{
char *s1;
char *s2;
s1="F";
s2=(char*)rr->comp->u.simple->u.generic;

这时 s2 能得到正确值 "F"

如果客户端不赋值 采用默认值 s2 就是错误的指针 程序报错 退出了

cofanz 2008-10-06
  • 打赏
  • 举报
回复
try catch
stivenjia 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jason_wentzel 的回复:]
判断每一级的指针是否为空
[/Quote]
不可取,如果是个野指针或者释放后没有指向NULL你这种判断方式还行的通吗?
例如:debug下声明一个指针你不进行初始化你看看指向的是哪里?绝大部分都是0xcccccccc而非NULL
孤客天涯 2008-10-06
  • 打赏
  • 举报
回复
判断每一级的指针是否为空
stivenjia 2008-10-06
  • 打赏
  • 举报
回复

BOOL IsValidAddress(const void* lp,UINT nBytes,BOOL bReadWrite)
{
// simple version using Win-32 APIs for pointer validation.
return (lp != NULL && !IsBadReadPtr(lp, nBytes) &&
(!bReadWrite || !IsBadWritePtr((LPVOID)lp, nBytes)));
}
我看你有戏 2008-10-06
  • 打赏
  • 举报
回复
判断每一级的指针是否为空
chinawcs 2008-10-06
  • 打赏
  • 举报
回复
也就是 有一些参数 没有赋值 采用的默认值 none

我又定义指针 来指向该参数值 结果抱 错误指针



chinawcs 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rollrock1987 的回复:]
你的这个 问题 看不懂哇 哈哈
[/Quote]

是这样的 定义了一个 字符指针 char *s2 指向一个rr->comp->u.simple->u.generic 当generic不存在值(none)s2 就成了错误指针 报错了

我知道我说清楚没有。

chenyu2202863 2008-10-06
  • 打赏
  • 举报
回复
你的默认分配内存了吗?
使用之前保证没被销毁吗?
yc_8301 2008-10-06
  • 打赏
  • 举报
回复
使用MFC的宏应该可以吧。
ASSERT_VALID
ASSERT
共同期待高手出现。。。
rollrock1987 2008-10-06
  • 打赏
  • 举报
回复
你的这个 问题 看不懂哇 哈哈


chinawcs 2008-10-06
  • 打赏
  • 举报
回复
忘了 告诉大家 现在这个工程我是用 vs2005 vc++ 编译的
stivenjia 2008-10-06
  • 打赏
  • 举报
回复
不过SEH不支持C++
stivenjia 2008-10-06
  • 打赏
  • 举报
回复

__try
{

}
__excpet(EXCEPTION_EXECUTE_HANDLER)
{

}

试一下SEH
zhtigt 2008-10-06
  • 打赏
  • 举报
回复
初始化一下
char *s2 = NULL;
看看行不行
chinawcs 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yayafu 的回复:]
用try{
}
catch(...)
{
}捕获啊
[/Quote]


try
{
s2=(char*)rr->comp->u.simple->u.generic; //直接报错了
}
catch(Z_RecordComposition *lp1) //关键是这里怎么写 怎么总也捕捉不到异常
{
s2="b";
}
加载更多回复(4)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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