memcpy和指针

memcpy和指针,c,memcpy,C,Memcpy,我对如何使用memcpy读取数组中复制的指针感到困惑。 以下是我尝试过的,但不起作用 基本上,我已经分配了一个内存块,在这个内存块中复制指针的方式类似于数组方式,但在重试过程中它不起作用。而这可以正确地处理基本数据类型 我想在元素块中存储任何内容,它可以是整数或指针 #include <stdio.h> #include <stdlib.h> #include <string.h> #define INDEX(x) ((char *)elements +

我对如何使用memcpy读取数组中复制的指针感到困惑。 以下是我尝试过的,但不起作用

基本上,我已经分配了一个内存块,在这个内存块中复制指针的方式类似于数组方式,但在重试过程中它不起作用。而这可以正确地处理基本数据类型

我想在
元素
块中存储任何内容,它可以是
整数
指针

#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;
}
#包括
#包括
#包括
#定义索引(x)((char*)元素+(sizeof(int*)*(x)))
int size=10;
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i

在上面的代码中,
f1_int
工作正常,但是
f2_int_ptr
不工作。

代码非常难看,所以我甚至不知道它应该如何工作,但是: 为什么在这里使用&v:

memcpy ( &v, INDEX(i), sizeof ( int ));
v是指针本身:

int *v = (int*)0;
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 );
    }
}
void f2_int_ptr(){
int i=0;
void*elements=malloc(size*sizeof(int*);
对于(i=0;i
请注意
memcpy()
参数的细微变化


注意:我真的,真的,真的,不会写这样的代码!很难理解。

如果要将指针存储在元素中,我认为最终的memcpy需要使用&v将元素复制到指针v。类似于v=元素[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 );
    }
}
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i
谢谢大家,终于成功了。 我想我还没有分配复制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 );
    }
}
void f2_int_ptr(){
int i=0;
void*elements=(void*)malloc(size*sizeof(int*);
对于(i=0;i
注意:所有这些从
void*
(以及宏)到void*(以及宏)的类型转换都不会让代码变得非常糟糕。您是否有任何理由到处使用
void*
?这适用于所有基本类型,但不仅仅适用于指针。如果您希望代码被读取,您应该尝试澄清代码。C是一个恶作剧()并不是一个这样编码的参数,它会在没有这个参数的情况下转储。我想从数组中读取,但不知道如何读取,数组中复制了指针。如果我使用指针到指针,那么我必须确保始终分配进入块的元素,我不能从堆栈中读取元素。@Oli Charlesworth,我同意这不是好代码,但在您的解决方案中,这意味着我必须使用不同的方法来复制和检索基本类型和指针类型。@Avinash:基本类型和指针类型是根本不同的。现在还不清楚你为什么希望能对他们一视同仁。你想在这里实现什么?我想用C写一个stl向量,如果客户端在堆上分配内存并作为元素传递给我,我就可以做到。但我希望它能与基本数据类型一起工作,并且不应该有特殊的方法在堆栈或堆变量上传递变量。有一种方法可以使用宏来实现这一点,但我正在寻找避免宏的选项。Ok。通过编辑,我想我看到了您正在尝试做的事情,(将指针复制到元素中。)因此我已更新。这也将转储,我想我需要在获取元素之前分配v。我不会认为您需要这样做,因为您已经有了原始的alloc。因为您存在内存泄漏。您没有在第一个或第二个循环中释放
v
。另外,您将
int
值存储在
元素中,而不是
int*
。看看我的答案。