strlen()
сообщает длину строки, а не объем памяти, связанный с выделением.
Функция strlen
возвращает количество символов, предшествующих завершающему нулевому символу. C11dr §7.24.6.3 3
Рассмотрим изменение кода OP.
char* binStr = "00000101";
printf("Result of strlen(binStr) %d\n", (int) strlen(binStr));
// Expect 8 to be printed.
char* b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
strcpy(b64str, "123");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 3 to be printed.
strcpy(b64str, "12345");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 5 to be printed.
Ни один из них не напечатал размер выделения, равный 9. Обратите внимание, что объем выделенной памяти, на который указывает b64str
, остается равным 9 даже после strcpy(b64str, "123");
size_t sz = strlen(binStr)+1)*sizeof(char);
printf("Allocation size %d\n", (int) sz);
// Expect 9 to be printed.
Не существует стандартного способа определить объем памяти, связанный с указателем, отличным от NULL
, который был возвращен из malloc()
.
malloc
не выделяет память для char*
(OP)
Код не проверял возвращаемое значение malloc()
, чтобы узнать, удалось ли выделение. Проведите NULL
проверку. Если код получает не-NULL
, выделение прошло успешно. Возвращаемое значение NULL
также допустимо, когда запрос размера равен 0, но это не проблема с strlen(binStr)+1
.
Функция malloc возвращает либо нулевой указатель, либо указатель на выделенное пространство. §7.22.3.4 2
char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) {
perror("OOM"); exit(-1);
}
Примечания:
Cast не требует возврата malloc()
.
sizeof(char)
всегда равно 1.
Надежный код проверяет результат выделения
char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) { perror("OOM"); exit(-1); }
Используйте "%zu"
для соответствия типу size_t
, возвращаемому из strlen()
.
printf("Result of strlen() %zu\n", strlen(b64str));
17.01.2017