C - 访问2D阵列槽功能不起作用,崩溃

时间:2015-04-22 22:21:40

标签: c arrays

我正在尝试使用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)
         }
   }
}

3 个答案:

答案 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;