求崩溃原因..........

wangsiyuanoo 2008-12-09 02:04:09
这个函数要实现的是使一块内存区域放大。

void GDrawScaleBuffer(int * destPtr, int * sourcePtr, bool fillAlpha, int sWidth, int sHeight, int dWidth, int dHeight)
{
int sourceWidth = sWidth;
int sourceHeight = sHeight;

int destWidth = dWidth;
int destHeight = dHeight;

int * sourceBuffer = sourcePtr;
int * destBuffer = destPtr;
int * tempSourceBuffer = sourceBuffer;

int sourceStride = sizeof(int);
int destStride = sizeof(int);

for (int y = 0; y < destHeight; y++)
{
int trueY = sourceHeight * y / destHeight;

for (int x = 0; x < destWidth; x++)
{
int trueX = sourceWidth * x * sourceStride / destWidth;
int trueXDest = x * destStride;
memset(&destBuffer[trueXDest], 0xff, destStride); //崩溃在这个地方!!!
memcpy(&destBuffer[trueXDest], &tempSourceBuffer[trueX], min(sourceStride, destStride));
if (fillAlpha)
{
destBuffer[trueXDest + 3] = 0xff;
}
}
tempSourceBuffer = sourceBuffer + (trueY * sourceWidth * sourceStride);
destBuffer += destWidth * destStride;
}
}
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wiowei 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wangsiyuanoo 的回复:]
引用 9 楼 wiowei 的回复:
memset(&destBuffer[trueXDest], 0xff, destStride); //崩溃在这个地方!!!
trueXDest = x * destStride;//这里错了,trueXDest = x; 范围0-destWidth,如果我没理解错的话

你的意思是
trueXDest = x * destStride;//改成trueXDest = x;?
[/Quote]
这个要你自己判断啦,你的destBuffer是int数组,长度是destWidth吗?destStride = sizeof(int)的话是4,x范围是0-destWidth,那么4*x作为数组下标的话明显不对吧。我是这么理解地。。
wangsiyuanoo 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wiowei 的回复:]
memset(&destBuffer[trueXDest], 0xff, destStride); //崩溃在这个地方!!!
trueXDest = x * destStride;//这里错了,trueXDest = x; 范围0-destWidth,如果我没理解错的话
[/Quote]
你的意思是
trueXDest = x * destStride;//改成trueXDest = x;?
fangyuan303687320 2008-12-09
  • 打赏
  • 举报
回复
同意上面的说法
zhanshen2891 2008-12-09
  • 打赏
  • 举报
回复
光看这个函数看不到重点,要看sourcePtr多长
wiowei 2008-12-09
  • 打赏
  • 举报
回复
memset(&destBuffer[trueXDest], 0xff, destStride); //崩溃在这个地方!!!
trueXDest = x * destStride;//这里错了,trueXDest = x; 范围0-destWidth,如果我没理解错的话

ysuliu 2008-12-09
  • 打赏
  • 举报
回复
memset(&destBuffer[trueXDest], 0xff, destStride);

这样的memset会不会越界呢?当&destBuffer[trueXDest] 指向buffer的最后一个字节的时候,destStride会比一大吗?如果会的话就越界了。。
ysuliu 2008-12-09
  • 打赏
  • 举报
回复
噢,我明白你的意思了,我再看看你的code啊

[Quote=引用 6 楼 ysuliu 的回复:]
memcpy()就是复制啊
参数的两个指针,第一个是目标地址,第二个是源地址,你只要写指针就行,数组就写数组名,不用转


引用 5 楼 wangsiyuanoo 的回复:
引用 4 楼 ysuliu 的回复:
这样写。。


C/C++ code
memset(destBuffer, 0xff, destStride); //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride));



C/C++ codememset(destBuffer, 0xff, destStride); /…
[/Quote]
ysuliu 2008-12-09
  • 打赏
  • 举报
回复
memcpy()就是复制啊
参数的两个指针,第一个是目标地址,第二个是源地址,你只要写指针就行,数组就写数组名,不用转


[Quote=引用 5 楼 wangsiyuanoo 的回复:]
引用 4 楼 ysuliu 的回复:
这样写。。


C/C++ code
memset(destBuffer, 0xff, destStride); //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride));



C/C++ codememset(destBuffer, 0xff, destStride); //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride)); //那我要复制的区域怎么赋值呢?
[/Quote]
wangsiyuanoo 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ysuliu 的回复:]
这样写。。


C/C++ code
memset(destBuffer, 0xff, destStride); //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride));
[/Quote]

memset(destBuffer, 0xff, destStride);  //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride)); //那我要复制的区域怎么赋值呢?

ysuliu 2008-12-09
  • 打赏
  • 举报
回复
这样写。。


memset(destBuffer, 0xff, destStride); //崩溃在这个地方!!!
memcpy(destBuffer, tempSourceBuffer, min(sourceStride, destStride));

wangsiyuanoo 2008-12-09
  • 打赏
  • 举报
回复

int * destBuffer = destPtr; //destBuffer是指向int
int destStride = sizeof(int);
memset(&destBuffer[trueXDest], 0xff, destStride); //这样也越界么?
wangsiyuanoo 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ma100 的回复:]
内存越界
[/Quote]
具体怎么解决啊?
谢谢
新人很急,工作中需要
ma100 2008-12-09
  • 打赏
  • 举报
回复
内存越界

65,211

社区成员

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

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