Ошибка указателя C, полученный код exc_bad_access = 2, адрес 0x100000000 - PullRequest
0 голосов
/ 06 октября 2018

Я так запутался в этой ошибке.Я написал код для разделения набора.Когда я запускаю его, иногда это работает, иногда получаю ошибку exc_bad_access code = 2.Вот код:

typedef struct vertexSet {
    int numVertexSet;
    int* set1;
    int* set2;
} set;

set* bipatitionSet(int Vertex) {

    if (Vertex%2){
        Vertex +=1;
    }

    set* set;
    set = malloc(sizeof(set));
    set->numVertexSet = Vertex/2;
    set->set1 = calloc(set->numVertexSet,sizeof(int));
    set->set2 = calloc(set->numVertexSet,sizeof(int));

    if (set == NULL) {
        printf("Set memory allocated error!");
        exit(1);
    }

    if (set->set1 ==NULL||set->set2==NULL) {
        free(set);
        printf("Set memory allocated error!");
        exit(1);
    }

    for (int i=0; i< set->numVertexSet; i++) {
        set->set1[i] = i;
        set->set2[i] = i + set->numVertexSet;// got error here
    }

    return set;
}

Когда я запустил его, я обнаружил, что адрес set2 изменяется в цикле for, и значение set2 [0] становится равным -17958193.Эта ошибка появляется иногда, но не всегда.Может кто-нибудь объяснить, почему и как исправить ошибку?Я проверил, что нет конфликта адресов.

1 Ответ

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

Вы не должны называть переменную так же, как тип, так как переменная будет скрывать тип (и как вы понимаете свой собственный код и определяете разницу между типами и переменными?).В этом случае «shadow» в значении похож на «overwrite».

Например, ваш malloc неверен, так как sizeof(set) будет размером переменной set, простой 4или 8-байтовый указатель, а не размер вашего 12-20 байт struct vertexSet.

...