我可能遗漏了一些基本的东西,但我无法找到解决以下问题的方法。 我有一些浮点元素的二维数组,我试图找到一种方法,只能使用一个值来引用它们。 例如:
float test[5][50];
test[3][25] = 34.67;
cout << test[3][25] << endl;
int id = 25;
cout << *test[id*5+3] << endl;
我希望从两个cout得到相同的结果。相反,我的输出看起来像这样:
34.67
Segmentation fault
我做错了什么?
谢谢!
答案 0 :(得分:5)
如果没有测试,我认为这样的事情可能有用。请注意,从左维度到右维度,C ++数组是主要的 - >次要的。
float test[5][50];
test[3][25] = 34.67;
cout << test[3][25] << endl;
int id = 25;
float* test2 = &test[0][0]
cout << test2[(3 * 50) + id] << endl;
答案 1 :(得分:2)
崩溃是因为您正在尝试将元素的内容作为内存地址读取
*test[id*5+3]
表示int address = test[id*5+3];
,然后在地址读取内存
如果该地址为0或您不拥有的内存,那么它将崩溃。
答案 2 :(得分:2)
测试是float[][]
,包含5个元素(每个元素都是float[]
,包含50个元素),您指的是test[128]
。因此,seg fault。你需要使用整数除法和mod:
cout << test[id/50][id%50] << endl;
您应assert(id/50<5);
确保索引在范围内。
答案 3 :(得分:1)
使用单个参考访问二维位图(图像)通常很有用。
使用:
int image2D[dim2][dim1];
int *image1D = &image2D[0][0];
现在
image2D[i][j] == image1d[i*dim1+j]
答案 4 :(得分:-1)
我同意第一条评论,你真的不应该这样做,但无论如何我都会回答。
我想如果你尝试:
cout << test[id*5+3] << endl;
它应该有用。无需使用*。
取消引用