为什么我得到EXC_BAD_ACCESS,即使指针看起来是有效的
Why do I get EXC_BAD_ACCESS even though the pointer appears to be valid?
我从一个整数数组test[]
开始,它表示一组图像。CCD_ 2的前两个元素是第一个图像的高度和宽度。以下四个(height*width)
元素是像素值。接下来的六个代表下一个图像,依此类推
我的目标是通过图像对象访问图像,而不复制test[]
阵列中的任何内容。我尝试通过ImageSet::import
来做到这一点。
int main(){
int test[] = {2,2,1,2,3,4,
2,2,4,5,6,7,
2,2,9,8,0,9};
ImageSet set = ImageSet();
set.import(test); //ImageSet::import
return 0;
}
ImageSet::import
使用光标变量来存储下一个图像的开始索引。它调用CCD_ 7将该数据读取到图像对象中。该特定图像的数据应当从地址&data[cursor]
开始。
void ImageSet::import(int data[]){
int cursor = 0;
for(int i = 0; i < NUM_SRC_IMAGES; i++){
int height = data[cursor];
int width = data[cursor+1];
source_[i].import(&data[cursor]); //this is Image::import
cursor += height * width + 2;
}
}
在image::import
中,我试图读取data[0]
,导致访问失败。根据调试器的说法,data[]
指向正确的值2,但当我试图通过data[0]
获取该值时,无论如何都会抛出EXC_BAD_ACCESS
。
void Image::import(int data[]){
height_ = data[0]; //the problem occurs right here
width_ = data[1];
matrix_ = &data[2];
}
如果能解释一下我做错了什么,我将不胜感激。对于如何在不使用指针运算的情况下实现目标,我同样非常感谢您的建议。
谢谢!
鉴于问题中的信息有限,我可以提出以下建议:
-
尝试将导入更改为
ImageSet::import(const int* data, size_t size)
或。。。优选地,ImageSet::import(const int (&data[18]))
-这允许清晰的参考,而不是在某些情况下可以优化掉的数据[]。后者还明确地向您的开发伙伴指定它是一个数组引用(而不是指针(。与Image::import
相同。 -
在
Image::import
中,打印出data
(即&data[0]
(的值-这将使您知道地址是否有效。 -
在循环结束时,在CCD_ 20中打印出CCD_。
我的猜测是,在第三个循环中,test[]
2的值变得太大,大于18。我不知道你的意图是什么……但cursor += 3 + 4*2
逻辑(作为一个例子(看起来真的很可疑。
我的猜测是,在优化阶段,编译器会将循环重新排列为
for(int i = 0; i < NUM_SRC_IMAGES; i++){
source_[i].import(&data[cursor]); //this is Image::import
int height = data[cursor]; // -> would also crash, but you don't see it because import crashes earlier
int width = data[cursor+1];
cursor += height * width + 2;
}
由于您定义的NUM_SRC_IMAGES太大,所以您的读数已经过了测试结束。
顺便说一句,您还应该考虑使用类似STL的迭代器样式,然后调用set.import(begin(test), end(test));
。通过从底层类型中抽象,您可以从任何容器中读取数据。你可以对照末尾进行检查,这样你就永远不会读过末尾。
- std::vector的包装器,使数组的结构看起来像结构的数组
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 尽管一切看起来都很好,但值不会交换
- 自制的上衣:看起来一样,但不完全相同
- 如何使它看起来像正在下的雪
- 如何用逗号分隔输出?如何改进此代码以使其看起来更体面?
- 我的代码看起来不错,但某些输入会导致不需要的输出
- 为什么这个结构的大小是 40,而它看起来应该是 12/24?
- 我需要将阵列样式的邻接矩阵转换为矢量样式(以使其看起来更好)
- 结构化绑定:当某些内容看起来像引用并且行为类似于引用,但它不是引用时
- 如何使QTextEdit看起来被禁用
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 看起来如此主要的错误.cpp:(.text.startup+0xd6):未定义对"vtable for Counter"的引用?
- C 时间测量看起来太慢了
- 我应该如何使 std::filesystem 看起来符合 Visual Studio 2015 的标准
- 未分配被释放的指针,但看起来已分配
- C 11 STD :: Promise返回STD :: String从线程中返回String,数据指针看起来已复制
- 将shared_ptr的嵌套智能指针重置为shared_ptr(或unique_ptr),看起来很矛盾
- 为什么我得到EXC_BAD_ACCESS,即使指针看起来是有效的