Проблема программирования на C, связанная переменная перезаписывается после использования STRCPY - PullRequest
0 голосов
/ 23 ноября 2010

Проблема в том, что переменная nodeType изменяется после завершения работы STRCPY. nodeType не является переменной, которая связана с любой другой переменной, используемой в вызове STRCPY. Это в той же структуре, хотя. nodeType - это перечисление со значением int, равным 3.

Ниже приведена следующая информация, которая, вероятно, наиболее актуальна. Я удалил большинство переменных из перечисления и структуры, чтобы они не были видны, я предполагаю, что они не имеют отношения к проблеме. Я кодирую в VS2010, если это имеет значение. Это часть задания по созданию btree, но у меня вопрос не имеет ничего общего с btrees.

enum NODETYPE
{ 
  ROOTLEAF
};
typedef struct node
{
  char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
  NODETYPE nodeType;
} nodeT;

... часть функции insertElement

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
  strcpy(b->tempNode->key[b->tempNode->numberOfKeys - i],  b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]);
}

.. функция, которую я вызвал, была для вставки элемента. До этого я вызывал эту функцию несколько раз, но это первый из приведенных ниже разделов кода. После того, как STRCPY запустится, nodeType принимает значение 1280070990. Я установил переменную для наблюдения, и пока она в CXX0017, ошибка, которая, как я предполагаю, только означает, что она не находится в области действия.

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

Решение было предоставлено ниже. Это была простая ошибка записи вне границы массива. Я сломал старый код, как это, а затем прошел через него. Это позволило мне определить проблему, которую я писал вне ключа массива ключей.

        for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
    {
        int sourceI = b->tempNode->numberOfKeys - i - 2;
        int destI = b->tempNode->numberOfKeys - i - 1;
        char *Source = b->tempNode->key[sourceI];
        char *Dest = b->tempNode->key[destI];
        strcpy(Dest, Source);
    }

Полный обзор структуры, в которой находились обе переменные.

typedef struct node
{
    node *childrenPTR[MAX_CHILDREN_ROOT]; 
    int depth; //Distance from root to node
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
    NODETYPE nodeType;
    int numberOfChildren;
    int numberOfKeys;
    node *parentPTR;
} nodeT;

Мы можем видеть из порядка переменных в структуре, что nodeType следует за key. Я считаю, что C будет выделять память в этом же порядке. Так что я мог бы посмотреть здесь, чтобы определить проблему.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

Вы копируете слишком длинную строку в ключ []. Это переполняется в nodeType.

Поскольку я предполагаю, что вы новичок в этом, я бы перекодировал это для более легкого чтения, чтобы вы могли понять, что происходит. Возможно что-то вроде:

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
  char *dest = b->tempNode->key[b->tempNode->numberOfKeys - i];
  char *source = b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)];
  strcpy(dest, source);
}

Пройдите через отладчик, и source, вероятно, будет длиннее, чем (с нулевым терминатором - вы ноль завершаете свои строки правильно?) MAX_KEY_LENGTH где-то в вашем массиве. Это может быть даже что-то сумасшедшее, даже не в вашем массиве.

Разбейте его на что-то меньшее и более легкое для отладки в дискретных шагах.

1 голос
/ 23 ноября 2010

Это именно то, что происходит, если вы используете функцию str *, которая ожидает строку с нулевым символом в конце, для чего-то, что не является строкой с нулевым символом в конце. Или если то, что вы копируете, недостаточно велико для того, что вы копируете в него.

...