我正在尝试使用2D矩阵进行计算。为什么这会在没有错误的情况下崩溃?
代码:
int main (void)
{
int myArray[2][3] = {{1,2,3},{5,4,3}};
int height = 2;
int width = 3;
modifyArray( (int**)myArray,height, width);
}
void modifyArray(int **array, int height1, int width1)
{
int result;
for(i=0;i<height1;i++)
{
for(j=0;j<width1;j++)
{
result = (**((array+i*3)+j));
printf("%d", result)
}
}
}
答案 0 :(得分:1)
强制转换为( int ** )
迫使myArray被视为指向int的指针数组。
它不是它的本质 - 它是编译器视为二维数组的单块内存。
答案 1 :(得分:0)
2D阵列被编译为单维阵列 查看程序集生成的单个数组(元素之间有4个字节的增量)
int myArray[2][3] = {{1,2,3},{5,4,3}};
000000013F6510D4 mov dword ptr [myArray],1
000000013F6510DC mov dword ptr [rsp+2Ch],2
000000013F6510E4 mov dword ptr [rsp+30h],3
000000013F6510EC mov dword ptr [rsp+34h],5
000000013F6510F4 mov dword ptr [rsp+38h],4
000000013F6510FC mov dword ptr [rsp+3Ch],3
通过对int **执行reinterpret_cast(c样式转换) - 正在访问的内存布局不再兼容 - 从而导致访问无效内存
答案 2 :(得分:0)
当函数将传递为int
的一维数组的数组视为可以简化为此时。
#include <stdio.h> // <<--- include
void modifyArray(int *array, int height1, int width1)
{
int i, j, result; // var declarations
for(i=0;i<height1;i++)
{
for(j=0;j<width1;j++)
{
result = *((array+i*3)+j);
printf("%d ", result); // added ;
}
}
}
int main (void)
{
int myArray[2][3] = {{1,2,3},{5,4,3}};
int height = 2;
int width = 3;
modifyArray( &myArray[0][0],height, width);
return 0;
}
节目输出:
1 2 3 5 4 3
如果要修改数组,只需使用,例如
即可*((array+i*3)+j) = result;