сдвинуть массив и вставить новый элемент в заданную позицию, используя memcpy - PullRequest
2 голосов
/ 28 марта 2012

Мне нужно сместить массив и вставить новый элемент в заданную позицию, используя memcpy.

Input: 2, 5, 7, 0, 0, 0

Expected output: 2, 3, 5, 7, 0, 0

Actual output: 2, 3, 5, 0, 0, 0

Есть ли ошибка в моем memcpy? (Я должен использовать массивы - не std::vectors)

#include <stdio.h>
int main()
{
    int i=0;
    int len=0;
    int a[6] = {'\0'};
    a[0]= 2;
    a[1] = 5;
    a[2]= 7;
    len=3;
    int b=0;
    b = 2;
    memcpy(a+2, a+1, b * sizeof(int));
    //memcpy(a+2, a+1, sizeof(int) * (len-1));
    a[1]=3;
    for(i=0;i<6;i++)
        printf("after %d \n", a[i]);
}

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

С справочной страницы для memcpy:

Области памяти не должны перекрываться. Используйте memmove (3), если области памяти перекрываются.

А для полноты из стандарта C99:

Если копирование происходит между перекрывающимися объектами, поведение не определено.

0 голосов
/ 28 марта 2012

Вы на самом деле правильно копируете 5 (a[1]), но оно записывает поверх 7 (a[2])

Вам нужно будет добавить еще один memcpy, чтобы сначала скопировать 7-ю запись, а затем вы можете скопировать 5-ю.

Однако, поскольку вы технически двигаете память, я бы посоветовал, что сказал Майк Сеймур, и сделаю памятку:

http://www.cplusplus.com/reference/clibrary/cstring/memmove/

...