переменные загадочно меняются - PullRequest
2 голосов
/ 02 декабря 2011

Вопрос: что вызывает случайное изменение этих значений?


Информация:

Мой код:

int q = nonZero;
for(j = nonZero;j>1;j--)
{
    printf("Top: %i %i\n",j,q);
    qsort(tree,j,sizeof(Node),cmp);
    printf("Bottom: %i %i\n",j,q);
    Node t = {tree[0],tree[1],-1};
    tree[0] = &t;
    tree[1] = tree[j];
    tree[j] = NULL;
}

Не сложная маленькая программа. сделать узел из двух верхних узлов дерева, сделать так, чтобы новый верхний узел, прибегнуть к массиву, повторить. Я добавил 'q' в качестве значения отладки, я совершенно не понимаю, что именно происходит. Если я попытаюсь запустить его, j обычно начинается с 73, что и должно быть, ожидается, что тогда оно будет равно 72,71,70,69,68 ... 3,2 и что q останется 73 на неопределенный срок. вот мой вывод, хотя:

Top: 73 73
Bottom: -796584576 32767
Segmentation fault

но это еще не все, без перекомпиляции, я получил:

Top: 73 73
Bottom: 0 0
Segmentation fault

это последовательно дало бы мне один из этих двух выходов. после нескольких прогонов я увидел, что 32767 никогда не менялось, значение q, но значение j, здесь -796584576, всегда было каким-то другим абсурдно большим отрицательным числом. у кого-нибудь есть идеи, почему на земле может показаться, что qsort изменяет мое значение j, а также то, что кажется совершенно не связанным значением q?

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

Я не уверен, что это ваша проблема, но поскольку t является локальной переменной, она выйдет из области видимости в конце этого цикла, и поэтому присвоение ей tree[0] делает tree[0] неопределенным.

2 голосов
/ 02 декабря 2011

Вызов qsort() предполагает, что tree[] - это массив Node s, но утверждение tree[0] = &t; скорее предполагает, что это массив указателей.Тогда в таком случае:

qsort( tree, j, sizeof(&Node), cmp ) ;

или лучше

qsort( tree, j, sizeof(*tree), cmp ) ;

последний гарантирует, что размер равен размеру любого массива, независимо от его типа, и поэтому безопаснее иремонтопригодны.

Присвоение адреса t переменной с большей областью действия, чем t, также обречено.

1 голос
/ 02 декабря 2011

t - локальная переменная, время жизни которой заканчивается в конце каждой итерации. Таким образом, сохранение адреса этого за пределами этой итерации - неопределенное поведение. Вы должны выделить копии узлов дерева с помощью malloc.

0 голосов
/ 02 декабря 2011

qsort портит память.Если это qsort, который вы написали, может произойти ошибка, которая записывает в недопустимое место.Если это библиотека qsort, то это, вероятно, рекурсивная функция, которая переполняет стек, разрушая ваши локальные переменные.

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