作为另一个数组的索引传递时,更改数组元素

时间:2015-08-03 17:33:04

标签: c arrays immutability

我是菜鸟,我希望这个问题不是一个天真的问题!

我有以下函数,其中我使用一个数组的元素作为另一个数组的索引。然而,尽管我对前者没有做任何改变,但我发现元素正在被修改。代码如下:

void convert_to_bitmap(int n_shapes, int sizex, int sizey,
                       int ll_x[n_shapes], int ll_y[n_shapes],
                       int ur_x[n_shapes], int ur_y[n_shapes],
                       int shapes_ll_bitmap[sizex][sizey],
                       int shapes_ur_bitmap[sizex][sizey] )
{
    int i;

    for (i = 0; i < n_shapes; i++)
    {
        printf("%d, %d, %d, %d check1\n", ll_x[i], ll_y[i], ur_x[i], ur_y[i]);

    }

    for (i = 0; i < n_shapes; i++)
    {
        shapes_ll_bitmap[ll_x[i]][ll_y[i]] = 1;
        shapes_ur_bitmap[ur_x[i]][ur_y[i]] = 1;

        printf("%d, %d, %d, %d check2\n", ll_x[i], ll_y[i], ur_x[i], ur_y[i]);
    }
}

并且,输出显示第一个数组在我这样做时已经改变了。有什么方法可以保持不变吗?

输出:

0, 0, 0, 7 check1
0, 9, 0, 15 check1
1, 0, 1, 7 check1
1, 9, 1, 15 check1
2, 13, 2, 15 check1
2, 17, 2, 24 check1
2, 26, 2, 32 check1
0, 0, 0, 7 check2
0, 9, 0, 15 check2
1, 0, 1, 7 check2
1, 9, 1, 15 check2
1, 13, 2, 15 check2
2, 1, 2, 1 check2
1, 26, 2, 32 check2

这是我在main()中调用函数的方法:

convert_to_bitmap(n_shapes, sizex, sizey, ll_x, ll_y, ur_x, ur_y, shapes_ll_bitmap, shapes_ur_bitmap);

int main()中矩阵的声明和初始化如下:

int ll_x[n_shapes];
int ll_y[n_shapes];
int ur_x[n_shapes];
int ur_y[n_shapes];

int sizex;
int sizey;

int shapes_ll_bitmap[sizex][sizey];
int shapes_ur_bitmap[sizex][sizey]; 

for (i=0; i < sizex; i++)
{
    for (j = 0; j < sizey; j++)
    {
        shapes_ll_bitmap[i][j] = 0;
        shapes_ur_bitmap[i][j] = 0;
    }
    printf("\n");
}

谢谢!

编辑:

这里有一些自包含的代码:

int main(void)
{   
    enum { MAX_SHAPES = 100000 };
    struct Rectangle rect_array[MAX_SHAPES];
    int n_shapes = read_shapes_rpt("shapes.rpt", MAX_SHAPES, rect_array);
    int i, j;

    float pitch_x = 0.044;
    float pitch_y = 0.042;

    float ll_x_flt[n_shapes];
    float ll_y_flt[n_shapes];
    float ur_x_flt[n_shapes];
    float ur_y_flt[n_shapes];

    int ll_x[n_shapes];
    int ll_y[n_shapes];
    int ur_x[n_shapes];
    int ur_y[n_shapes];

    int sizex;
    int sizey;

    int shapes_ll_bitmap[sizex][sizey];
    int shapes_ur_bitmap[sizex][sizey]; 

    for (i=0; i < sizex; i++)
    {
        for (j = 0; j < sizey; j++)
        {
            shapes_ll_bitmap[i][j] = 0;
            shapes_ur_bitmap[i][j] = 0;
        }
        printf("\n");
    }

    if (n_shapes > 0)
    {
        transform_to_shape_bit_locations(n_shapes, rect_array, ll_x_flt, ll_y_flt, ur_x_flt, ur_y_flt, ll_x, ll_y, ur_x, ur_y, &pitch_x, &pitch_y, &sizex, &sizey);

        convert_to_bitmap(n_shapes, sizex, sizey, ll_x, ll_y, ur_x, ur_y, shapes_ll_bitmap, shapes_ur_bitmap);

        printf("%d\n%d\n%d\n", n_shapes, sizex, sizey);
        /* Use the shapes that were read */
    }



    return 0;
}

我的shapes.rpt文件包含以下csv值:

1.408,529.237,1.43,529.523
1.408,529.597,1.43,529.883
1.452,529.237,1.474,529.523
1.452,529.597,1.474,529.883
1.496,529.777,1.518,529.883
1.496,529.957,1.518,530.243
1.496,530.317,1.518,530.564

1 个答案:

答案 0 :(得分:4)

您的变量sizexsizey未初始化。这意味着您的矩阵shapes_ll_bitmapshapes_ur_bitmap具有不可预测的大小(行为实际上是未定义的)。

请注意,当您实际为以后的sizexsizey分配有意义的值时,已经太晚了。已经使用不确定大小声明了矩阵,这是最终的。声明矩阵后,对sizexsizey值的任何更改都不会对矩阵产生任何影响。

你的矩阵最终会出现一些不确定的大小,导致convert_to_bitmap函数内的越界访问和无关内存值的破坏。