malloc()
выделит блок памяти и вернет указатель на эту память в случае успеха и NULL в случае неудачи. размер блока памяти задается аргументом malloc
в байтах.
оператор sizeof
дает размер своего аргумента в байтах.
char *someString = malloc(sizeof(char) * 50)
это выделит достаточно места для строки из 49 символов (строка в стиле C должна заканчиваться символом NULL ('\0'
)), не включая символ NULL, и указывает someString
в этой памяти.
Похоже, что код в вашем вопросе должен быть malloc(sizeof(char) * 2);
, так как sizeof(char) + 2
не имеет смысла.
обратите внимание, что sizeof(char)
гарантированно всегда равен 1 (байт) - но представление в памяти других типов (таких как long) может варьироваться в зависимости от компилятора.
Способ, которым вам (не) везет с динамически выделенной памятью, заключается в том, что вы пытаетесь читать / писать вне выделенной памяти.
Например,
char *someString = malloc(10);
strcpy(someString, "Hello there, world!");
printf("%s\n", someString);
Первая строка выделяет достаточно места для 9 символов и символа NULL.
Вторая строка пытается скопировать 20 символов (19 + NULL) в это пространство памяти. Это приводит к переполнению буфера и может привести к чему-то невероятно остроумному, например, к перезаписи смежной памяти или к ошибке segfault.
Третья строка может сработать, например, если рядом с someString выделена память, и "Привет, мир!" столкнулся с этим пространством памяти, он может напечатать вашу строку плюс все, что было в следующем пространстве памяти. Если бы этот второй пробел был завершен до NULL, он бы остановился - если только он не был, в этом случае он отошел бы и в конечном итоге перестал работать.
Этот пример - довольно простая операция, но так легко ошибиться. С хитростью - будь осторожен.