2010-09-16 34 views
0

我遇到了一些問題。C中使用void的通用可編輯函數*

我需要寫像memcpy(void*, const void*)一些功能,它的簽名應該是:

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len) 

我注意到,在很多實施memcpy,我們投無效*爲char *,但我認爲這是不在我的情況下,arrayCopy函數需要用於多種類型的數組,包括structs

那麼,我該如何做到這一點?

編輯: 的源代碼可能是類似的東西:

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

void arrayCopy(void *, int, const void *, int, int, size_t); 

int main(void) 
{ 
    int i; 
    int dest[10] = {1}; 
    int src [] = {2, 3, 4, 5, 6}; 

    arrayCopy(dest, 1, src, 0, 5, sizeof(int)); 

    for (i=0; i<10; i++) printf("%i\n", dest[i]); 

    return 0; 
} 

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len, size_t size) 
{ 
    char *cdest = (char*) dest; 
    const char *csrc = (char*) src; 
    int i; 

    len *= size; 

    if (dest == src) 
    { 
     printf("Same array\n"); 
    }else 
    { 
     cdest += (dIndex * size); 
     csrc += (sIndex * size); 
     for (i=0; i<len; i++) 
      *cdest++ = *csrc++; 
    } 
} 

感謝。

回答

2

「char *」只是一堆字節,C中的所有內容最終都是字節 - 您可以將指針指向任何數據結構以char *(您還需要知道結構的內存大小)

+0

char *與int *具有相同大小的ptr,但* int_var需要4個字節,而* char_var需要1個字節(在4個字節的系統上) – 2010-09-16 19:02:18

+0

正確的代碼如上所示。謝謝 – 2010-09-16 19:22:07

2

的功能必須有一個元素大小的信息,如:

void *arrayCopy(void *dest, size_t di,const void *src, size_t si, size_t num, size_t esize) 
{ 
    char *cdest = (char*) dest; 
    const char *csrc = (char*) src; 
    return memcpy(&cdest[esize*di], &csrc[esize*si], esize*num); 
} 
... 
arrayCopy(dest, 1, src, 0, 5, sizeof*src); 
2

你不能void類型的對象。該標準不允許。所以你需要拋棄虛空,最好使用的是unsigned char。標準保證unsigned char可以訪問系統中可表示的任何其他類型的所有位。