• help C++ memcpy Помогите скопировать один массив (src), размером 8192*1056+8 байт в другой (dst), размером 8192*1056 байт, со сдвиигом на 8 байт, то есть dst[i] = src[i+8], с помощью memcpy. Код memcpy(dst, src+8, 8192*1056) не работает...
  • ideone.com


    может 8192*1056 не помещается в i?
  • @vt, а я копирую не в цикле, а в memcpy
  • src = (unsigned char *)malloc((8192*1056 + 8) * sizeof(unsigned char));
    dst = (unsigned char *)malloc(8192*1056 * sizeof(unsigned char));
    memcpy(src, dst+8, 8192*1056); // это не работает
    free(src);
    free(dst);
  • @Pavel81, src с dst нужно поменять местами, при вызове malloc не надо указывать sizeof(unsigned char), это лишнее. Вот правильный код:

    const unsigned len = 8192*1056;
    char src = (char)malloc(len + 8);
    char dst = (char)malloc(len);
    memcpy(dst, src+8, len);
    free(src);
    free(dst);

    Код memcpy(dst, src+8, 8192*1056) не работает...
    что значит не работает? программа падает? массив копируется не правильно?
  • @sany, похоже что не работает именно src+8, потому что сдвига не происходит
  • @Pavel81, в реальной твоей программе тип src какой?
  • @Pavel81, пример который дал я — тоже не работает?
  • @sany,
    unsigned char *src, *dst;
    src = (unsigned char *)malloc((8192*1056 + 8) * sizeof(unsigned char));
    dst = (unsigned char *)malloc(8192*1056 * sizeof(unsigned char));
  • @Pavel81, вообще какой-то левый код, где знак * между 1056 и sizeof ?
    я не поленился и проверил, вот этот код работает корректно:
    unsigned char src = (unsigned char)malloc(8192*1056 + 8);
    unsigned char dst = (unsigned char)malloc(8192*1056);
    memcpy(dst, src+8, 8192*1056);
  • @sany, sizeof(unsigned char) можно не писать, ибо это = 1 :-)
  • @sany,

    вот мой весь код:
    int _tmain(int argc, _TCHAR* argv[])
    {
    int i;
    unsigned char *src, *dst;
    src = (unsigned char *)malloc(8192*1056 + 8);
    dst = (unsigned char *)malloc(8192*1056);
    if(src != NULL)
    {
    for(i = 0; i < 16; i++)
    if (i < 8)
    src[i] = 0;
    else src[i] = (unsigned char) i;
    }
    if(dst != NULL)
    {
    for(i = 0; i < 16; i++)
    dst[i] = (unsigned char) i;
    }
    else printf("Can't allocate memory.\r\n");

    for (i = 0; i < 16; i++)
    printf("%02x ", src[i]);
    printf("\r\n");
    printf("\r\n");
    for (i = 0; i < 16; i++)
    printf("%02x ", dst[i]);
    printf("\r\n");
    printf("\r\n");

    memcpy(dst, src+8, 8192*1056);
    printf("Copied!\r\n");

    for (i = 0; i < 16; i++)
    printf("[%%02x ", src[i]);
    printf("\r\n");
    printf("\r\n");
    for (i = 0; i < 16; i++)
    printf("%02x ", dst[i]);
    printf("\r\n");
    printf("\r\n");

    if (memcmp(src, dst, 8192*1056)==0)
    printf("Equal!\r\n");
    else
    printf("Not equal!\r\n");

    getchar();
    free(src);
    free(dst);
    return 0;
    }

    и вот что он выводит:

    00 00 00 00 00 00 00 00 08 09 0a 0b 0c 0d 0e 0f

    00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f

    Copied!
    00 00 00 00 00 00 00 00 08 09 0a 0b 0c 0d 0e 0f

    08 09 0a 0b 0c 0d 0e 0f cd cd cd cd cd cd cd cd

    Not equal!

    то есть не равны массивы после копирования по первым 8192*1056 байтам
  • @Pavel81, ты копируешь массив src с 8 позиции, а начинаешь сравнение с первой, ты сравни memcmp(src+8, dst, 8192*1056) и они будут равны.
  • @sany, уже допёр! спасибо за стимулирование мозга THUMBS UP