Могут ли указатели генерировать разные результаты в разных компиляторах?В чем проблема? - PullRequest
0 голосов
/ 18 декабря 2018

Я учусь с более глубоким доступом к памяти в C, и у меня есть вопрос, который я не могу решить.У меня есть код ниже, который решает башни Ханоя итеративно.И он прекрасно работает как на GCC, так и на CLANG, но не на VS2017.

#include <stdio.h>
#include <stdlib.h>

void solve(const int NUM_DISK)
{
    const int ALPHA[2][3][2] =
    {
        { { 1, 3 }, { 3, 2 }, { 2, 1 } },   /* even */
        { { 1, 2 }, { 2, 3 }, { 3, 1 } }    /* odd */
    };

    const int MAX_ITER = 1 << NUM_DISK;

    int **list = (int **) malloc( (MAX_ITER - 1) * sizeof(int*) );

    int start, gap, disk, k, rank;

    for (start = 1, gap = 2, disk = 1; disk <= NUM_DISK; ++disk, start <<= 1, gap <<= 1)
    {
        int **pp = (int **) &ALPHA[(NUM_DISK + disk) % 2];

        for (k = 0, rank = start; rank < MAX_ITER + (disk % 2); rank += gap, ++k)
        {
            list[rank - 1] = (int *) &pp[k % 3];
        }
    }

    for (rank = 0; rank < (MAX_ITER - 1); ++rank)
    {
        char origem  = list[rank][0] + 64;
        char destino = list[rank][1] + 64;
        printf("%4d ) %c --> %c\n", (rank + 1), origem, destino);
    }

    free(list);
}

int main(int argc, char **argv)
{
    int d = atoi(argv[1]);
    solve(d);
    return 0;
}

Предполагается, что у нас есть 3 диска:мне в чем проблема?

...