簡體   English   中英

使用memcpy復制指針(而不是它的內容)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM