непонятки с strncpy

neznayko
Дата: 10.05.2015 16:08:41
        const char * str = "My second long string";
		
	int sz = 12;
	char *strcp2 = malloc(sz + 1);
	strncpy(strcp2, str, sz);
	//strcp2[sz] = '\0';

	printf("str copy 10 simbols is %s\n", strcp2);

	free(strcp2);


1) Если выполнять прогу без закомментированной строки,
то printf выводит :
My second lo
- и дальше абракадабру
почему?
а если раскомментировать
strcp2[sz] = '\0';

то все нормально
почему глючит без явного присваивания '\0'?
так и должно быть или я что то делаю не правильно?

2)для переменной str нужно явно освобождать память?
Dimitry Sibiryakov
Дата: 10.05.2015 16:41:58

neznayko
почему?

Потому что, упёршись в предел, strncpy не вставляет в результат терминирующий нуль. Ты
ведь помнишь значение слов "null-terminated strings"?..

Posted via ActualForum NNTP Server 1.5

neznayko
Дата: 13.05.2015 12:22:59
const char * str = "My second long string";

для переменной str нужно явно освобождать память?
RWolf
Дата: 13.05.2015 14:00:42
neznayko,

нет, эту память никто не выделял.
flamevlas
Дата: 13.05.2015 14:52:59
malloc, в отличие от calloc, не заполняет выделенную память нулями. Поэтому в конце strcp2 не обязательно будет нулевой символ.
Замени malloc(sz + 1) на calloc(sz + 1, 1)
flamevlas
Дата: 13.05.2015 14:59:03
P.S. strncpy не добавил нуль к строке, т.к. было достигнуто ограничение по количеству копируемых символов(аргумент sz). См. описание strncpy http://cppstudio.com/post/690/