memcpy (), каким должно быть значение параметра размера? - PullRequest
17 голосов
/ 21 апреля 2010

Я хочу скопировать массив int в другой массив int. Они используют одно и то же определение длины, поэтому они всегда будут одинаковой длины.

Каковы плюсы / минусы следующих двух альтернатив параметра размера для memcpy ()?

memcpy(dst, src, ARRAY_LENGTH*sizeof(int));

или

memcpy(dst, src, sizeof(dst));

Будет ли второй вариант работать всегда? Независимо от содержания?

Одна вещь, которая благоприятствует последнему, состоит в том, что, если массив будет изменен, будет некоторая домашняя работа по обновлению memcpy ().

Спасибо

Ответы [ 12 ]

0 голосов
/ 21 апреля 2010

Если dst был выделен из кучи (например, с помощью malloc), второе решение не будет работать. sizeof (dst) будет работать только тогда, когда он известен компилятору. Например, в следующем примере произойдет сбой, так как sizeof (dst) будет равен размеру указателя (4-8 байт.)

#define ARRAY_LENGTH 10
int *dst;

dst = malloc(ARRAY_LENGTH*sizeof(int));
memcpy(dst, src, sizeof(dst)); // sizeof dst in this case would be 4 bytes on 32 bit system

Этот сегмент кода будет работать каждый раз:

#define ARRAY_LENGTH 10
int *dst;

dst = malloc(ARRAY_LENGTH*sizeof(int));
memcpy(dst, src, ARRAY_LENGTH*sizeof(int)); // sizeof would be 40 bytes
0 голосов
/ 21 апреля 2010

Это зависит. Оба arr и pointer являются массивами, но sizeof () возвращает только правильный размер для arr, который объявлен во время компиляции.

int main() {
        int arr[10];
        int * pointer;
        pointer = (int *) malloc(10 * sizeof(int));
        printf("%d\n", sizeof(arr)); // 40
        printf("%d\n", sizeof(pointer)); // 4 or 8
        free(pointer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...