Почему strncpy не работает со строкой, выделенной с помощью malloc? - PullRequest
1 голос
/ 22 сентября 2010
char* temp;

temp = (char*) malloc (strlen(window->entry.value)+1);
//strncpy( temp, window->entry.value, sizeof(temp) ); DOESN"T WORK
memcpy (temp, window->entry.value, strlen(window->entry.value) + 1); //WORKS

(где window-> entry.value представляет собой строку.)

Спасибо.

Ответы [ 2 ]

6 голосов
/ 22 сентября 2010

sizeof(temp) не делает то, что вы думаете, что делает. Он сообщает вам размер, в байтах, указателя на тип char, который равен temp. Скорее всего, в вашей системе 4 или 8.

Это не имеет никакого отношения к длине какой-либо конкретной строки или размеру любого конкретного буфера, возвращаемого из malloc.

Это просто случайность, что вы указали правильную длину при использовании memcpy и неправильную длину при использовании strncpy. memcpy также не будет работать, если передано sizeof(temp) как длина, и strncpy будет работать, если передано правильная длина.

0 голосов
/ 22 сентября 2010

Strncpy не волнует, откуда у вас память. Тот факт, что вы использовали sizeof (temp), показывает, что вы не знаете слева направо в строках C, потому что это работает только для статически расположенных буферов char []. Причина, по которой memcpy работает, а strncpy - нет, заключается в том, что вы фактически передали memcpy параметр разумной длины, но совершенно забыли, чтобы этот параметр имел какой-либо смысл для strncpy.

...