memcpy и указатели - PullRequest
       5

memcpy и указатели

11 голосов
/ 01 апреля 2011

Я не совсем понимаю, как читать указатели, скопированные в массив, используя memcpy. Вот что я пробовал, но не работает.

По сути, я выделил блок памяти, в который копирую указатели, похожие на массив, но во время повторной попытки он не работает. Хотя это правильно работает с основными типами данных

Я хочу сохранить что-либо в блоке element, это может быть либо integers, либо pointers.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INDEX(x)  ((char *)elements + (sizeof(int*) * (x)))
int size = 10;

void f2_int_ptr() {    
    int i = 0;
    void *elements = (void*)malloc(size * sizeof(int*));
    for ( i = 0; i < size; i++ ) { 
       int *v = ( int *) malloc ( sizeof(int));
       memcpy ( v, &i, sizeof ( int ));


       memcpy ( INDEX(i) , v,  sizeof (int*));
    }
    for ( i = 0; i < size; i++ ) { 
        int *v = (int*)0;
        memcpy ( v, INDEX(i), sizeof(int *));
        printf ( "%d\n", *v );
    }
}
void f1_int() {
    int i = 0;
    void *elements = (void*)malloc(size * sizeof(int));
    for ( i = 0; i < size; i++ ) { 
       memcpy ( INDEX(i) , &i,  sizeof (int));
    }
    for ( i = 0; i < size; i++ ) { 
        int v;
        memcpy ( &v, INDEX(i), sizeof ( int ));
        printf ( "%d\n", v );
    }
}
int main(){
    f1_int();
    f2_int_ptr();
    return 0;
}

В приведенном выше коде f1_int работает нормально, но f2_int_ptr не работает.

Ответы [ 4 ]

8 голосов
/ 01 апреля 2011

f2_int_ptr() должно стать следующим:

void f2_int_ptr() {
    int i = 0;
    void *elements = malloc(size * sizeof(int*));

    for ( i = 0; i < size; i++ ) { 
       int *v = malloc ( sizeof(int));
       memcpy ( v, &i, sizeof ( int ));
       memcpy ( INDEX(i) , &v,  sizeof (int*));
    }

    for ( i = 0; i < size; i++ ) {
        int *v;
        memcpy ( &v, INDEX(i), sizeof(int *));
        printf ( "%d\n", *v );
    }
}

Обратите внимание на тонкие изменения в аргументах memcpy().

Примечание: я действительно, оченьне пишите такой код!Это невероятно трудно следовать.

0 голосов
/ 01 апреля 2011

спасибо, ребята, все заработало наконец.я думаю, я не выделил место для копирования memcpy.

void f2_int_ptr() {    
    int i = 0;
    void *elements = (void*)malloc(size * sizeof(int*));
    for ( i = 0; i < size; i++ ) { 
       int *v = ( int *) malloc ( sizeof(int));
       memcpy ( v, &i, sizeof ( int ));

       memcpy ( INDEX(i) , v,  sizeof (int*));
    }
    for ( i = 0; i < size; i++ ) { 
        int *v = ( int *) malloc (sizeof(int*));
        memcpy ( v, INDEX(i), sizeof(int*));
        printf ( "%d\n", *v );
    }
}
0 голосов
/ 01 апреля 2011

Если вы храните указатели в элементах, я думаю, что конечный memcpy должен использовать & v для копирования элемента в указатель v. Подобно v = elements [i].

void f2_int_ptr() {    
    int i = 0;
    void *elements = (void*)malloc(size * sizeof(int*));
    for ( i = 0; i < size; i++ ) { 
       int *v = ( int *) malloc ( sizeof(int));
       memcpy ( v, &i, sizeof ( int *));


       memcpy ( INDEX(i) , &v,  sizeof (int*));
    }
    for ( i = 0; i < size; i++ ) { 
        int *v = (int *)0;
        memcpy ( &v, INDEX(i), sizeof(int *));
        printf ( "%d\n", *v );
    }
}
0 голосов
/ 01 апреля 2011

Код очень уродливый, поэтому я даже не знаю, как он должен работать, но: Почему вы используете & v здесь:

memcpy ( &v, INDEX(i), sizeof ( int ));

v - это сам указатель:

int *v = (int*)0;
...