2011-04-01 111 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