Как скопировать char * на char в c ++ - PullRequest
0 голосов
/ 30 марта 2011

Я работал над вопросом в c ++, но я застрял в части. Это длинный код, но я опубликую лишь небольшую его часть, где я застрял сейчас. Вот оно;

char* x = (char*)malloc(sizeof(char));
char y = (char)malloc(sizeof(char));
y = *x;

Проблема в том, что когда я делаю это, если X указывает на символ с именем «HELLO», когда я печатаю y, он печатает только букву «H».

Я хочу скопировать все слово char * в переменную char. Также я не знаю размеры символов, потому что они даны пользователем. Таким образом, длина может быть чем угодно. Я попытался strcpy (), но не смог решить проблему.

Любая помощь приветствуется.

** Спасибо за все комментарии. Теперь я решил использовать std :: string в соответствии с вашими комментариями. И я думаю, я никогда больше не буду использовать malloc. Теперь я должен вернуться к коду и изменить все в соответствии со строкой и проверить, все ли работает.

Ответы [ 5 ]

5 голосов
/ 31 марта 2011

Перефразируя Иниго Монтойю, я не думаю, что этот код означает то, что вы думаете, что он означает.

malloc(sizeof(char))

Это выделяет определенный объем памяти.Сколько памяти выделяется, определяется параметром malloc.В этом случае вы передаете sizeof(char), который по определению равен одному байту.Следовательно, вы выделяете один байт памяти.

Если вы настаиваете на использовании malloc (подробнее об этом позже), то вам следует выяснить, какую длину строки вы хотите сохранить, добавьтееще один байт для терминатора NULL, а затем malloc.В случае строки Hello, world., которая составляет 13 символов, соответствующий вызов будет:

malloc(14)

Далее:

char y = (char)malloc(sizeof(char));

malloc возвращает указатель на память, выделенную для вас.y в данном случае это не указатель, это просто char.Два не одинаковы.Он компилируется, и кажется работающим, потому что вы используете инструмент дубления, известный как приведение в стиле C: (char)malloc(...).Это говорит компилятору: «Я знаю, что нацеливаю пистолет на свою ногу. Просто делай то, что я тебе говорю, и не жалуйся».Который это покорно делает.Но вы поступаете неправильно по нескольким причинам:

  1. malloc возвращает указатель, но вы пытаетесь привести его к char
  2. . Вы выделили только 1байт, но вы предполагали, что выделяете память для всей строки
  3. y - это всего лишь char, но вы рассматриваете ее как целую строку.

Итакесли вы снова настаиваете на использовании malloc, вам нужно сделать что-то вроде этого:

static const char* HELLO = "Hello, malloc.";

char* x = malloc(strlen(HELLO)+1);
strcpy(x, HELLO);
char* y = malloc(strlen(x)+1);
strcpy(y, x);

Но вы не должны вообще использовать malloc в C ++.Вместо этого вы должны использовать std::string:

std::string x = "Hello, string.";
std::string y = x;

Это лучше, потому что:

  1. string s управляет собственной памятью.Вы не теряете память, как это было в вашем коде.
  2. string безопаснее для типов.Вы нарушили безопасность типов, когда бросили возврат с malloc на char.Вы можете сделать это, но это не char.Это плохо.string не позволит вам так себя застрелить без особых усилий.
  3. Это меньше кода.Лучший код - это код, который вы никогда не пишете.
5 голосов
/ 30 марта 2011

ЭТО не должно - оно должно рухнуть, на самом деле это, вероятно, даже не должно компилироваться!

Строка char y = (char)malloc(sizeof(char)); не имеет смысла

malloc резервирует некоторую память и затем возвращает указатель на эту память - вы не можете назначить указатель на переменную без указателя, такую ​​как 'y'

Также в 1-й строке вы попросили malloc зарезервировать память для одного символа, sizeof (char) = 1, а не количество символов, введенных пользователем.

1 голос
/ 31 марта 2011

Предпочтение std::string.

Поскольку в строках стиля C используются указатели, их нельзя скопировать с помощью присваивания (operator=).

Вам придется использовать семейство функций strxxx, например, strcpy для копирования. Не забудьте выделить память для получателя перед копированием.

1 голос
/ 30 марта 2011

Вы не можете поместить целое слово в переменную char, потому что тип char содержит только один символ.Поскольку в стандартном C нет типа string, вам необходимо использовать массив символов для представления строки.

Кроме того, функция malloc всегда возвращает только указатель, поскольку память, которую вы пытаетесь использоватьвыделить проживает где-то в куче.Не существует способа (*) динамически увеличивать или уменьшать стек, чтобы он содержал значение переменной длины.

(*) В стандарте C нет способа, хотя для него есть место с использованием явно нестандартных функцийкоторые не переносимы.

0 голосов
/ 30 марта 2011

Все в этом коде неверно.Первая строка выделяет место для одного символа и сохраняет адрес в x.Тот факт, что в нем содержится более одного персонажа без сбоев, является чистой удачей.Вторая строка еще хуже, поскольку она выделяет пространство для одного символа, а затем превращает адрес в один символ.

Это должно выглядеть примерно так: char x = (char ) malloc(SizeOf (Char) * sizeOfYourString);char y = (char ) malloc (sizeof (char) * sizeOfYourOtherString);

strcpy (x, y);

...