Больше похоже на C-код. Почему вы используете C-строки и стандартные строки? В любом случае, похоже, что ваша ошибка не связана. Назначение до Testthis = &*Look_in
бесполезно (не говоря уже о вызове new
утечки памяти). В этом случае нет причин сначала разыменовывать свой узел Look_in
, а затем брать адрес. Вы должны иметь возможность просто изменить это утверждение на Testthis = Look_in
.
Однако, если это ошибка времени выполнения, убедитесь, что Look_in != NULL
или не удален где-то еще.
Похоже, у вас есть небольшая путаница с указателями в целом; так что вот быстрое сокращение.
Указатели указывают на область памяти, в которой хранится некоторое значение. Поэтому, когда вы объявляете указатель и назначаете ему какое-то место в памяти, вы указываете этому указателю, где в памяти искать какой-либо элемент. Когда вы разыменовываете действительный ненулевой указатель, вы можете получить значение, которое содержит это место в памяти. Например,
Node x[64]; // An array of 64 nodes
Node * t = x; // t points to element 0 of x. Therefore, changing values of x changes values of t and changing values of t changes values of x
Кроме того, распределение / освобождение памяти - это отдельная история. Память стека (как указано выше для обоих этих объявлений) управляется операционной системой. Однако распределение кучи зависит от вас (т.е. new
/ delete
).
Node * x = new Node;
// Do stuff with your node - it is on the heap, so it is persistent until you explicitly remove it
delete x;
Самое большое различие между стеком и кучей состоит в том, что память кучи превышает срок службы функции. Например, каждая функция получает свой собственный стековый фрейм для объявления переменных. Однако при выходе из функции стековый фрейм освобождается. Однако в динамической памяти могут храниться значения, которые не являются исключительными для времени жизни одной функции.
Простой пример:
int* giveMeAnInt()
{
int x;
return &x;
}
В приведенной выше функции мы объявляем переменную local и пытаемся вернуть ее адрес в качестве указателя на это значение. Однако после того, как мы вернемся, это значение в любом случае вытесняется из стека, так как функция завершилась. Чтобы сделать это правильно, вам необходимо:
int* giveMeAnInt()
{
int* x = new int;
return x;
}
Второй пример объявляет переменную в куче и возвращает ее адрес. Но не забывайте, что если вы используете new
, вы должны delete
позже. Другой быстрый пример (используя рабочую версию кода выше, т.е. пример 2)
...
int * z = giveMeAnInt();
cout<< *z << endl;
delete z; // Free the memory allocated by the giveMeAnInt() function
...
Это много быстрой информации, но удачи.
EDIT
Возможно, если у вас сбой на ...->NAME[n]
, то NAME[n]
не существует. Обратите внимание, что вы эффективно разыменовываете Testthis
на sizeof(Testthis->NAME)
, поэтому проблема не в указателе. Если вы ищете количество символов в строке для указателя, то вы должны использовать strlen()
, а не sizeof()
.
Вот проблема, с которой мы сталкиваемся: разница между массивом и указателем. Если вы объявите char someArray[64]
, то sizeof(someArray) == 64
. Однако, если вы объявляете char* someArray
, то sizeof(someArray) == 4
(начиная с sizeof(char*) == 4
, предполагая 32-битный компьютер. Но на данный момент константа не имеет значения), а не фактическое количество символов. Чтобы быть в безопасности, вы должны вместо этого просто использовать strlen(someArray)
, который будет работать, как ожидается, для обоих объявлений.