Перефразируя Иниго Монтойю, я не думаю, что этот код означает то, что вы думаете, что он означает.
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(...)
.Это говорит компилятору: «Я знаю, что нацеливаю пистолет на свою ногу. Просто делай то, что я тебе говорю, и не жалуйся».Который это покорно делает.Но вы поступаете неправильно по нескольким причинам:
malloc
возвращает указатель, но вы пытаетесь привести его к char
- . Вы выделили только 1байт, но вы предполагали, что выделяете память для всей строки
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;
Это лучше, потому что:
string
s управляет собственной памятью.Вы не теряете память, как это было в вашем коде. string
безопаснее для типов.Вы нарушили безопасность типов, когда бросили возврат с malloc
на char
.Вы можете сделать это, но это не char
.Это плохо.string
не позволит вам так себя застрелить без особых усилий. - Это меньше кода.Лучший код - это код, который вы никогда не пишете.