Код выделяет 10 байт в куче и присваивает указателю s адрес выделенной области: char *s = malloc(10);
Важно учесть несколько моментов и рекомендации:
Заголовок
В C нужно подключить , иначе может быть предупреждение/ошибка (раньше компилятор мог не знать прототип malloc).
Проверка на NULL
Всегда проверяйте возвращаемое значение: if (s == NULL) { / обработка ошибки / }
Размер и null-терминатор
malloc(10) выделяет ровно 10 байт. Если вы собираетесь хранить C-строку длиной 10 символов, нужен дополнительный байт для терминального '\0' — выделите 11 байт: char *s = malloc(10 + 1);
sizeof
Писать с sizeof безопаснее для обобщённого кода: char s = malloc((n + 1) sizeof *s); (sizeof(char) == 1, но такой стиль уменьшает ошибки при смене типа)
Неявное приведение (CAST)
В C не нужно и не рекомендуется приводить результат malloc: / правильно в C / char *s = malloc(11);В C++ требуется приведение: char s = (char)malloc(11); — но в C++ лучше использовать new.
Инициализация
malloc не инициализирует память. Если нужна нулевая инициализация, используйте calloc: char s = calloc(n + 1, sizeof s);
Освобождение
Не забывайте free(s) после использования, чтобы не было утечек памяти.
Пример:
include include include
int main(void) { size_t n = 10; char s = malloc(n + 1); / 10 символов + '\0' */ if (s == NULL) { perror("malloc"); return 1; } strcpy(s, "0123456789"); puts(s); free(s); return 0; }
Если нужно что-то конкретное (почему ошибка, поведение компилятора, использование в конкретном контексте), напишите — поясню подробнее.
Код выделяет 10 байт в куче и присваивает указателю s адрес выделенной области:
char *s = malloc(10);
Важно учесть несколько моментов и рекомендации:
Заголовок
В C нужно подключить , иначе может быть предупреждение/ошибка (раньше компилятор мог не знать прототип malloc).Проверка на NULL
Всегда проверяйте возвращаемое значение:if (s == NULL) { / обработка ошибки / }
Размер и null-терминатор
malloc(10) выделяет ровно 10 байт. Если вы собираетесь хранить C-строку длиной 10 символов, нужен дополнительный байт для терминального '\0' — выделите 11 байт:char *s = malloc(10 + 1);
sizeof
Писать с sizeof безопаснее для обобщённого кода:char s = malloc((n + 1) sizeof *s);
(sizeof(char) == 1, но такой стиль уменьшает ошибки при смене типа)
Неявное приведение (CAST)
В C не нужно и не рекомендуется приводить результат malloc:/ правильно в C / char *s = malloc(11);В C++ требуется приведение: char s = (char)malloc(11); — но в C++ лучше использовать new.
Инициализация
malloc не инициализирует память. Если нужна нулевая инициализация, используйте calloc:char s = calloc(n + 1, sizeof s);
Освобождение
Не забывайте free(s) после использования, чтобы не было утечек памяти.Пример:
include include includeint main(void) {
size_t n = 10;
char s = malloc(n + 1); / 10 символов + '\0' */
if (s == NULL) {
perror("malloc");
return 1;
}
strcpy(s, "0123456789");
puts(s);
free(s);
return 0;
}
Если нужно что-то конкретное (почему ошибка, поведение компилятора, использование в конкретном контексте), напишите — поясню подробнее.