C Адрес памяти целочисленного указателя внезапно меняется - PullRequest
0 голосов
/ 20 марта 2020

Скажем, у нас есть файл с таким содержанием:

1
2
3
4
5
5
4
3
2
1
2
3
4
5
1
4
5
3
2
1
5
1
2
3
4

Затем с этим кодом:

int main(){

    FILE * file = fopen("CondorcetVote.txt", "r");

    int candidateCount = 4;
    int voters = 5;
    int voteClassificationSize = 5;

    int a,b,c,d,e,f,g,h,i,j;
    int votePosition, voteIndex;
    char * temp = malloc(sizeof(char) * 100);

    CommonVote * cV = malloc(sizeof(int) * voters);
    int groupCVCount = 0;

    int * votesToModify = calloc(voters * voteClassificationSize, sizeof(int));
    int add = 0;

    printf("VC %d\n", voteClassificationSize);

    for(a=0;a<voters;a++){
        (cV+a)->votes = calloc(voteClassificationSize, sizeof(int));
        for(b=0;b<voteClassificationSize;b++){
            *( ((cV+a)->votes) + b) = 0;
           // printf("%p\n", ( ((cV+a)->votes) + b));
            //printf("Initialize Dis %d\n", *( ((cV+a)->votes) + b));
        }
        (cV+a)->count = 0;
    }

    //for(a=0;a<v)


    for(a=0;a<voters;a++){
        for(b=0;b<voteClassificationSize;b++){
            fgets(temp, NAME_MAX, file);
            int length = strlen(temp);
            temp += length - 1;
            *temp = '\0';
            temp -= length - 1;
            *(votesToModify+add) = getIntegerFromChar(temp);


            ///printf("VTM: %d\n", *(votesToModify+add));
            add++;
        }
    }

    add = 0;

    for(a=0;a<voters;a++)
        for(b=0;b<voteClassificationSize;b++){
            printf("%d\n",*( ((cV+a)->votes) + b));
        }

  fclose(file);
  free(cV);
  free(temp);
  return 0;
}

Теперь проблема в том, что адрес ИЗМЕНЕН. Несмотря на то, что целочисленный указатель голосов имеет достаточный выделенный размер, и адрес фактически печатается правильно, если печатается сразу после вызова функции callo c, если адрес печатается в третьем l oop, как показано выше, он все равно будет печататься справа, пока переменная a во втором l oop не достигнет 4, адрес памяти которого он внезапно изменит.

это печатный адрес:

00782C68
00782C6C
00782C70
00782C74
00782C78
007823C8
007823CC
007823D0
007823D4
007823D8
007823E8
007823EC
007823F0
007823F4
007823F8
00000001
00000005
00000009
0000000D
00000011

Глядя на последний адрес, значение сразу изменилось во что-то ... Нужна помощь в этой проблеме.

...