мой массив malloc меняет непреднамеренные значения? - PullRequest
0 голосов
/ 24 октября 2018

Возможно, это я нуб, но ....

Я пытаюсь использовать двумерный массив, который выделяется динамически.Я следовал методу, показанному здесь , где они делают обходной путь, используя массив с одним размером, равным «Row x Column».

Когда я делаю некоторое тестирование, я заполняю все позициимассива с номером 2, а затем я получил доступ к отдельным позициям и изменил их на 9, чтобы посмотреть, где A (1), A (2), A (3) и т. д. по отношению кодно измерение.

Все идет, как и ожидалось, пока я не попытаюсь изменить A [5], когда я это сделаю, две позиции массива перезаписываются, а не просто 5. Есть идеи о том, что происходит?

Кстати, обращение к позициям массива через "A [5] и A [4]" против "* (A + 5) и * (A + 4)" дает одинаковые результаты.

Спасибо за любую помощь!:)

Это:

int main()
{
    int dim1, dim2, row, column, i=0;
    scanf("%d",&dim1);
    scanf("%d",&dim2);
    printf("dim1=%d dim2=%d\n", dim1, dim2);

    int *A;
    A=(int* )malloc(dim1*dim2*sizeof(int));
    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                    A[(row*dim1)+column]=2;
                    i++;
            }
    }
    printf("Before assignment\n");
    *(A+5)=9;//<<<<<<<-THIS IS WHERE I AM ACCESSING THE ARRAY
    printf("after assignment\n");


    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                   printf("%d ", A[(row*dim1)+column]);
            }
            printf("\n");
    }

Результатов это: Доступ к A [5]

Но это:

int main()
{
    int dim1, dim2, row, column, i=0;
    scanf("%d",&dim1);
    scanf("%d",&dim2);
    printf("dim1=%d dim2=%d\n", dim1, dim2);

    int *A;
    A=(int* )malloc(dim1*dim2*sizeof(int));
    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                    A[(row*dim1)+column]=2;
                    i++;
            }
    }
    printf("Before assignment\n");
    *(A+4)=9;//<<<<<<<-THIS IS WHERE I AM ACCESSING THE ARRAY
    printf("after assignment\n");


    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                   printf("%d ", A[(row*dim1)+column]);
            }
            printf("\n");
    }

Результатов это: Доступ к A [4]

1 Ответ

0 голосов
/ 24 октября 2018

Это неправильный адрес.

A[(row*dim1)+column]=2;
       ^^^^

Это dim1 должно быть dim2.

A[(row*dim2)+column]=2;

Напомним, что dim1 - это количество строк, а dim2 - количество столбцов.Может быть полезно назвать их nrows и ncols или другое описательное имя.

A[(row*ncols)+column]=2;
...