2011-04-01 113 views
10

我很迷惑如何使用memcpy读取数组中复制的指针。 以下是我所尝试过的,但不起作用。memcpy和指针

基本上,我已经分配了一块内存,其中我拷贝类似于数组时尚的指针,但在重试期间它不起作用。虽然这适用于基本数据类型

我想在element块中存储任何东西,它可以是integerspointers

#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不起作用。

+0

注意:所有对'void *'(和宏)进行的类型转换并不会让你的代码变得非常讨厌。你有什么理由在任何地方使用'void *'吗? – 2011-04-01 10:43:28

+0

这适用于所有基本类型,但不适用于指针。 – Avinash 2011-04-01 10:44:47

+0

如果你打算阅读,你应该尝试澄清你的代码。 C是一个骗局(http://www.gnu.org/fun/jokes/unix-hoax.html)不是这样的代码的参数。 – mouviciel 2011-04-01 10:52:52

回答

7

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

增加了更多问题。 – Avinash 2011-04-01 10:50:51

+0

如果我使用指针指针,那么我必须确保始终分配进入块的元素,我不能从堆栈中获取元素。 – Avinash 2011-04-01 10:56:02

+0

@Avniash:上面的代码中没有堆栈元素。 – 2011-04-01 10:57:17

0

代码很丑陋,所以我不知道应该如何工作,但: 为什么ü使用& v这里:

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

v是指针本身:

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

它没有那个转储。我想从数组中读取数据,我不知道如何做,数组有指针复制。 – Avinash 2011-04-01 10:48:01

0

如果你正在将指针存储在元素中,我认为最后的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

这个核心转储。 – Avinash 2011-04-01 11:12:19

+0

好的。通过编辑,我想我会看到你正在尝试做什么,(将指针复制到元素中),所以我已经更新了。 – sickgemini 2011-04-01 11:40:06

+0

这也会转储,我想我需要在获取元素之前分配v。 – Avinash 2011-04-01 11:55:44

0

谢谢伙计们,它终于工作了。 我想我还没有分配复制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

此代码不起作用;你有内存泄漏。 – 2011-04-01 11:41:45

+0

为什么这不起作用, – Avinash 2011-04-01 11:50:36

+0

因为你有内存泄漏。你没有在第一或第二个循环中释放'v'。另外,你将'int'的值存储在'elements'中,而不是'int *'中。看到我的答案。 – 2011-04-01 11:56:41