указатели персонажа (выделенные новым) и их инициализация - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть некоторые сомнения относительно символьных указателей:

1. когда мы пишем объявление:

char *t;

нам нужно сделать

t=new char[6];
strcpy(t,"terry");

или напрямую

 t="terry";

сделает ..

2. Также, если мы будем следовать, do

char *t;
t=new char[6];
t="terry";

теперь будет указывать на выделенную память из кучи или первую буквуТерри (если мы посмотрим с точки зрения манипулирования указателями).

3.Если я напишу:

char *t;

, а затем я должен инициализировать 't' в '\ 0'(но t должен указывать на выделенное пространство памяти) .. как мне это сделать, потому что мой компилятор mvc 2010 не позволяет ...

t=new char[5](0);//0 is the ascii value of '\0'

Ответы [ 4 ]

3 голосов
/ 21 сентября 2011

Вы помечены C ++. Используйте строку:

std::string t("terry"); и пусть язык позаботится о деталях для вас.

  1. В любом случае, в зависимости от ваших потребностей. Если вам нужно изменить строку позже, вы должны выделить память, а при выделении всегда не забывайте удалять ее позже.

  2. Первая буква литерала.

  3. t=new char[5]; t[0] = 0;

1 голос
/ 21 сентября 2011

1. Если строка (например, «terry») не будет изменена где-либо в вашей программе, вы, безусловно, можете сделать

char* t = "terry";

и забыть о выделенной памятидля строки, поскольку она будет освобождена сама по себе.Однако, лучшая практика программирования для константных строк будет означать t как const char* следующим образом:

const char* t = "terry";

Но если это изменится, то это будет либо

char* t = new char[6];
strcpy(t, "terry");

или

char t[6];
strcpy(t, "terry");

В первом случае, когда используется оператор new, вам потребуется освободить память, выделенную с помощью new, после того как вам больше не нужна строка:

delete[] t;

Во втором случае память, лежащая в основе sting, будет автоматически освобождена, когда t покинет область C ++ (фигурные скобки), в которой она была объявлена ​​(но если t является членом объекта, память будетосвобождается только тогда, когда объект разрушен).

2. После

char* t;
t = new char[6];
t = "terry";

t действительно будет указывать на «махровый», но указатель / адресвам нужно освободить память, выделенную с помощью new, потеряно навсегда.

3. Строковые нулевые терминаторы ('\ 0') аналогичны другим символам: они должны находиться где-тов памяти.Вы были достаточно мудры, чтобы выделить 6 байтов для «terry», длина которого составляет 5 символов: после

char* t = new char[6];
strcpy(t, "terry");

6-й байт блока памяти, на который указывает t, содержит нулевой терминатор.Но

char* t;

не выделяет никакой памяти, кроме указателя t.Итак, если вы хотите, чтобы строка содержала только нулевой терминатор (быть нулевой длины), вы можете сделать это следующим образом:

char* t = new char[1];
t[0] = '\0';
1 голос
/ 21 сентября 2011
  1. Вы не должны делать второе, потому что t равно char*, и поэтому t="terry" устарело (и ваш компилятор может выдать это предупреждение, указывающее оператор присваивания.)

  2. Выделенная память просочилась, поскольку вы ее не использовали, и t указывает на terry. Опять же, это устарело (и ваш компилятор может выдать это предупреждение, указывающее оператор присваивания).

  3. Просто сделайте: t = new char[5](); По умолчанию оно инициализировано.

Как правило, лучшая практика - std::string. Так что используйте это:

std::string t = "terry";

Нет утечки памяти, нет устаревшей функции, нет предупреждений. Нет напряжения.

1 голос
/ 21 сентября 2011
  1. Вы можете сделать последний вариант, но указатель, скорее всего, будет указывать на область памяти только для чтения, поэтому вы должны делать это только с const char *.
  2. В этом случае t в конечном итоге будет указывать на область памяти только для чтения, пропуская эти 6 байтов.
  3. Вы можете использовать функцию memset(), чтобы установить для всего массива значение 0.

Но да, используйте вместо этого std::string и перестаньте думать об этом.

...