如何用assert检测数组访问越界??

xychzh 2010-08-26 09:11:19

void TestFunc(char* pOut, int len)
{
for (int i=0; i<len-1; i++)
{
pOut[i] = 'a';
}

pOut[len-1] = '\0';
}


这个函数能否用assert检测数组访问越界的情况??


我看到有这样的写法:

void TestFunc(char* pOut, int len)
{
for (int i=0; i<len-1; i++)
{
pOut[i] = 'a';
ASSERT(pOut[i]>0),
}

pOut[len-1] = '\0';
}

不知道这个办法是不是我所想的那样,因为如果i的值越界了,那程序执行到赋值那一句,就发生异常了,轮不到ASEERT()
...全文
295 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-08-26
  • 打赏
  • 举报
回复
我的理解。

void TestFunc(char* pOut, int len, int index)
{
assert(pOut != NULL);
assert(index >= 0 && index <len);
// do what you want to do
}

shi3590 2010-08-26
  • 打赏
  • 举报
回复
那在最前面加上assert(pOut==NULL);
shi3590 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiehui3651 的回复:]
strlen(pOut)这样获取数组长度会有问题的
[/Quote]

啥问题?
xychzh 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xiehui3651 的回复:]
strlen(pOut)这样获取数组长度会有问题的
[/Quote]

对,这个函数的目的是为一个缓冲区设置数据,也就是说一般情况下,这个pOut缓冲区是空数据,也就没法strlen()了。
xiehui3651 2010-08-26
  • 打赏
  • 举报
回复
strlen(pOut)这样获取数组长度会有问题的
shi3590 2010-08-26
  • 打赏
  • 举报
回复
ASSERT(i<strlen(pOut)-1);
打错了。
lovestefanie 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xychzh 的回复:]
引用 3 楼 lovestefanie 的回复:
这样肯定不对,你这个for循环不就检查了是否越界了么?


我的目的是检测这个函数是否被成功调用,也就是说,可能我调用这个函数的时候,参数len设置越界了。
而我如果就这样写,那程序异常中断,我就不知道哪里出错了。
用assert的目的就是可以知道程中断是由程序中的哪一行引起,这给调试程序带来了极大的方便,很多项目都是这么做的。
[/Quote]
ASSERT(pOut[i]>0),这句话越界和不越界都可能会发生,起不到你想到的作用,
你自己人工的尽量保证len的正确性了
shi3590 2010-08-26
  • 打赏
  • 举报
回复
void TestFunc(char* pOut, int len)
{
for (int i=0; i<len-1; i++)
{
ASSERT(i>strlen(pOut)-1);
pOut[i] = 'a';
//ASSERT(pOut[i]>0),
}

pOut[len-1] = '\0';
}

xychzh 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lovestefanie 的回复:]
这样肯定不对,你这个for循环不就检查了是否越界了么?
[/Quote]

我的目的是检测这个函数是否被成功调用,也就是说,可能我调用这个函数的时候,参数len设置越界了。
而我如果就这样写,那程序异常中断,我就不知道哪里出错了。
用assert的目的就是可以知道程中断是由程序中的哪一行引起,这给调试程序带来了极大的方便,很多项目都是这么做的。
youdaping777 2010-08-26
  • 打赏
  • 举报
回复
不能用ASSERT,传递参数不一样,没意义!!
  • 打赏
  • 举报
回复
检测不了...
clwahaha 2010-08-26
  • 打赏
  • 举报
回复
................................................
lovestefanie 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 xychzh 的回复:]
C/C++ code

void TestFunc(char* pOut, int len)
{
for (int i=0; i<len-1; i++)
{
pOut[i] = 'a';
}

pOut[len-1] = '\0';
}



这个函数能否用assert检测数组访问越界的情况??


我看到有这样的写……
[/Quote]
这样肯定不对,你这个for循环不就检查了是否越界了么?
qqwx_1986 2010-08-26
  • 打赏
  • 举报
回复
这个只能自己保证len是不是越界了,中间的assert没有意义
老吴笔记 2010-08-26
  • 打赏
  • 举报
回复
pOut[i]不可能小于0吗?

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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