Пример указателя в учебнике меня смущает - PullRequest
0 голосов
/ 05 ноября 2011

Я сейчас перебираю указатели в классе, и наш учебник меня немного смущает.Они начинают с того, что следующий пример копирует значение в месте, на которое указывают деньги, в место, на которое указывает myMoney:

*myMoney = *money;

Затем следующий пример копирует значение в деньгах в myMoney

myMoney = money;

Этот второй пример вызывает утечку памяти, поскольку исходное местоположение, указанное * myMoney, больше не доступно.Это потому, что память, которая раньше содержала указатель, теперь является реальным значением с плавающей запятой вместо адреса памяти?

Теперь часть, которая меня немного смущает, находится в следующей части, когда они показывают другое объявление.Полный пример:

char alpha[20];
char *alphaPtr;
char *letterPtr;
vod Process(char []);
.
.
alphaPtr = alpha;
letterPtr = &alpha[0];
Process(alpha);

Поскольку в книге сказано, что

myMoney = money;

создаст утечку памяти, поскольку она разрывает связь между указателем и указателем на адрес, будет

alphaPtr = alpha;

вызвать ссылку на память также?Не должны ли они объявить это как

char *alphaPtr = *alpha;

Ответы [ 4 ]

2 голосов
/ 05 ноября 2011

Что нужно помнить:

  • myMoney и money являются указателями, поэтому myMoney = money; копирует один указатель поверх другого. Теперь у вас есть два указателя, указывающих на одну и ту же вещь (на что указывает money), и ничего не указывает на то, на что myMoney указывает (это утечка памяти).
  • *myMoney и *money - это значения , на которые указатели указывают (поскольку * разыменовывает указатель, чтобы получить то, на что он указывает), поэтому *myMoney = *money; копирует то, на что указывает money, на что указывает myMoney; сами указатели не изменились.
  • alpha - это массив , который может быть ухудшен до указателя на первый элемент в массиве.
  • Нет никакой утечки с alphaPtr, потому что она вообще ни на что не указывала.
  • Да, char *alphaPtr = *alpha; Был бы намного лучший способ написать это, потому что тогда alphaPtr не тратит время на инициализацию. Некоторые компиляторы даже предупреждают вас, когда вы объявляете неинициализированные указатели, такие как пример из учебника.
  • Использование (разыменование) неинициализированного указателя является плохой вещью , так как приводит к ужасному неопределенному поведению. Ваша программа может аварийно завершить работу немедленно или может произойти сбой намного позже просто испортите ваши данные, ничего вам не сказав, и вы найдете их только спустя месяцы, если вообще когда-либо.
0 голосов
/ 05 ноября 2011

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

alphaPtr = alpha не утечка,alpha - это фактическая память, alphaPtr просто указывает на нее.Даже если alphaPtr назначен для указания на что-то другое, alpha существует в стеке и будет автоматически возвращаться, когда он выходит из области видимости.

char *alphaPtr = *alpha не скомпилируется.Вы пытаетесь присвоить char для char*, что недопустимо.

0 голосов
/ 05 ноября 2011

Проблема с назначением указателей

myMoney = money;

просто означает, что если myMoney является единственным указателем на значение, у вас больше нет возможности получить к нему доступ.

0 голосов
/ 05 ноября 2011

Этот второй пример вызывает утечку памяти, поскольку исходное местоположение, указанное * myMoney, больше не доступно. Это потому, что память, которая раньше содержала указатель, теперь является фактическим значением с плавающей запятой вместо адреса памяти?

Местоположение памяти, сохраненное в myMoney, теперь потеряно. Если бы он был выделен, не было бы способа восстановить его адрес, чтобы освободить его.

Во втором примере массивы отличаются тем, что ссылка на них по имени ссылается на их адрес.

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