Почему изменяется переменная k с 5 на 7 при работе с указателем?

204
02 мая 2018, 05:17

При добавлении элемента в список, изменяется переменная k, причём иногда программа отрабатывает правильно k всегда равно пяти. Но по каким-то причинами она становится равной 7, потом 9. В конечном результате должны в массив добавляться слова, но если у них одинаковый хеш, то они добавляются в список.

#include "stdafx.h"  
#include <iostream> 
using namespace std;
struct Lib
{
    char word[50];
    Lib *next;
};
void Print(Lib **array,int n);
void Search(Lib obj[], int n);
void Push(Lib **array, char s[], int hesh);
void main()
{
    setlocale(LC_ALL, "Russian");
    int b = 5, k;
    cout << "Введите количество слов:";
    cin >> k;
    Lib *array = NULL;
    int hesh;
    char s[50];
    for (int i = 0; i < k ; i++)
    {
        hesh = 0;
        cout << "Введите слово:" << endl;
        cin >> s;
        for (int j = 0; j < strlen(s); j++)
        {
            hesh += (int)s[j] + 3;
        }
        while (hesh > b - 1)
        {
            hesh = hesh - 5;
        }
        cout << hesh << endl;
        Push(&array,s, hesh);
    }
    //Print(&array, b);
    system("pause");
}
void Push(Lib **array, char s[], int hesh) {
    Lib *el = new Lib;
    strcpy_s(el->word, s);
    el->next = *(array+hesh);
    *(array + hesh) = el;
}
Answer 1
 Lib *array = NULL;

После этого

 Push(&array,s, hesh);

а в ней

*(array + hesh) = el;

Т.е. вы по сути просто портите стек рядом с array, записывая не пойими куда значение el - в том числе, вероятно, и в место в памяти, занимаемое переменной k.

Для начала нужно выделить память для array, а потом - с учетом того, что в Print вы передаете адрес переменной - еще и использовать выражение типа (*array+hesh), а не (array+hesh).

READ ALSO
Передача значений из одной функции в другую и сравнение адресов элементов стека

Передача значений из одной функции в другую и сравнение адресов элементов стека

Нужно, чтобы вычисленные в функции Min_Max значения адресов min и max сохранялись и передавались в функцию CountА функция Count должна считать элементы...

201
Можно ли использовать класс string вместе со scanf?

Можно ли использовать класс string вместе со scanf?

Для вывода объекта класса string с помощью printf можно воспользоваться методом c_str()

231
Непонятное поведение программы

Непонятное поведение программы

Нужно написать реализацию метода шаблонного класса List для простых типов данных и строк(сhar*), которая будет загружать список с csv файлаНаписал,...

211