[英]Copying a pointer (instead of it's content) using memcpy
我有一個程序來處理通用鏈表。 在一種情況下,我用它來保持字符串。 在我將新節點添加到列表的函數中,我執行以下操作(以及其他內容..):
void list_append(list *list, void *element)
{
// create the new node...
listNode *node = (listNode *)malloc(sizeof(listNode));
node->data = malloc(list->elementSize); // NOTE : elementSize is set to be sizeof(char *)
node->next = NULL;
memcpy(node->data, element, list->elementSize); //**
// rest of the insertion operation....
現在,在調用list_append函數的函數中,執行以下操作:
int numNames = 5;
const char *names[] = { "David", "Kevin", "Michael", "Craig", "Jimi" }; //*
int i;
list list;
list_new(&list, sizeof(char *), free_string ,compareString);
char *name;
for(i = 0; i < numNames; i++) {
name = strdup(names[i]);
list_append(&list, &name); //****
}
另外,我有一個“比較方法”來比較2個字符串:
int compareString(void *str1,void *str2)
{
return strcmp(*(char **)str1 ,*(char **)str2);
}
如果是這樣,我幾乎沒有問題:1)在memcpy行動的行中復制了什么(行// ** - 指針或內容?是否與要復制的數據存儲在行中的方式有關調用函數(行// *)?2)通用鏈表的節點定義為:void * data; 那么為什么當我使用比較方法時,我必須將其轉換為(char * )str1 ....如果我以另一種方式復制了字符串,那么轉換是否會有所不同? 謝謝分配(!!),蓋伊。
3)另一件事 - 如果我將memcpy執行的復制操作更改為:
memcpy(node->data, element, strlen((char *)element) + 1); //**
它也有效 - 兩種不同的方式有區別嗎? 如果是的話 - 什么更好?
1)您正在復制元素中包含的數據,而不是指針。 如果要復制指針,則需要將&element作為第二個參數傳遞。
2)編譯器不知道void指向的是什么,因此需要強制轉換為其類型。
3)如果您的鏈表功能應該是通用的,那么第一個實現更好。 否則,您的函數只適用於字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.