Язык C: Почему мой оператор присваивания разрушает мои данные? - PullRequest
0 голосов
/ 25 июня 2011

Посмотрите на этот код:

void insert(Poly **A, int degree, int coef2) {
    heapSize = heapSize+1;
    Poly *key;

    if (heapSize == 1) {        // heap was originally empty
        key->coef = coef2;
        key->degree = degree;
        A[heapSize-1] = key;
        return;
    }

    // create an "minus infinity" degree poly 
    int keyDegree = degree;

    key->coef = coef2;
    key->degree = MIN_INT;

    A[heapSize-1] = key ;
    heapIncreaseKey(A, heapSize-1, keyDegree);
}

Poly - это структура, члены которой имеют тип int.«A» - это массив указателей Poly.Всякий раз, когда выполняется оператор «A [heapSize-1] = key» (в блоке if), члены «ключа» почему-то меняются на «ненужные» значения.Например, непосредственно перед выполнением этого оператора значения членов «ключа» равны 5 и 6. После выполнения этого оператора значения меняются до примерно восьмизначных номеров мусора.Кто-нибудь может сказать мне, почему?Спасибо

Ответы [ 6 ]

4 голосов
/ 25 июня 2011

Вы пропали без вести

key = malloc(sizeof(Poly));

Объявление key дает вам указатель, но не указывает на правильное местоположение. Разыменование key вызывает неопределенное поведение.

EDIT

Кроме того, похоже, что heapsize является глобальной константой, а A является указателем на кучу. Кажется странным иметь глобальную переменную записи размером с неглобальный.

Я бы сделал heapsize переменной с той же областью, что и A, и передал бы указатель на нее в качестве аргумента функциям, имеющим дело с A.

2 голосов
/ 25 июня 2011

key - неинициализированный указатель, а затем вы разыменовываете его и присваиваете значения в несуществующее место, на которое он указывает. Это было бы поймано Вальгриндом.

1 голос
/ 25 июня 2011

Выделите память для ключа и измените сигнатуру для передачи размера для массива A.Убедитесь, что размер кучи все еще находится в пределах выделенного диапазона для A. Более того, вам не нужна ключевая переменная, если вы реорганизуете, чтобы сохранить структуры, а не указатели в вашем массиве Poly's.Тогда вы можете просто назначить два входа непосредственно в A с помощью чего-то вроде A [heapSize] .coef = coef2;Также вы можете немного упростить ситуацию, используя heapSize в своей функции, не увеличивая его в первой строке и увеличивая его только в точке выхода.Таким образом, вам не нужно везде использовать heapSize-1.

0 голосов
/ 25 июня 2011

Вы должны использовать свой указатель перед его использованием :)!

0 голосов
/ 25 июня 2011
Клавиша

ни на что не указывает. Кроме того, выделенная длина «А» не указана. Рекомендую вам заболеть 'malloc' и т. Д. :)

0 голосов
/ 25 июня 2011
Клавиша

является неинициализированным указателем, и вы пишете в него.

Этот путь лежит строго неопределенным поведением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...