Question読んでください。ダブルポイナーを使ってディープコピーを実行するには?
以下のコードでにターンpreOrderTraversal()
で使用Stack
で使用List
、ルート付きツリーの、再帰を含まないが、明示的なスタックを使用して、 /* list.h */ typedefは構造体リスト{
void **array;
int lastItemPosition;
int size;
}List;
#define INITIAL_LIST_SIZE 50
List *createList(List *list, Op opType){
List *lptr = (List *)malloc(sizeof(List));
void *array = NULL;
if(opType == CREATE_NEW_LIST){
array = malloc(INITIAL_LIST_SIZE*sizeof(void*));
lptr->array = &array;
lptr->array = memset(lptr->array, 0, INITIAL_LIST_SIZE*sizeof(void *));
lptr->lastItemPosition = -1;
lptr->size = INITIAL_LIST_SIZE;
}else if(opType == DOUBLE_THE_LIST){
array = malloc(2*(list->size)*sizeof(void *));
lptr->array = &array;
lptr->array = memcpy(lptr->array, list->array, list->size*sizeof(void*));
lptr->lastItemPosition = list->lastItemPosition;;
lptr->size = 2*(list->size);
}else if(opType == HALF_THE_LIST){
array = malloc(((list->size)/2)*sizeof(void *));
lptr->array = &array;
lptr->array = memcpy(lptr->array, list->array, (list->size/2)*sizeof(void *));
lptr->lastItemPosition = list->lastItemPosition;;
lptr->size = (list->size)/2;
}
return lptr;
}
void insertItem(List *, void *, int);
void *deleteItem(List *, int);
List* createList(List *, Op);
/* Stack.h */
#include"list.h"
typedef struct Stack{
List *arrayList;
}Stack;
void push(void *);
void *pop();
void*top();
Wrtの、
lptr->array = memcpy(lptr->array, list->array, list->size*sizeof(void*));
memcpy
は、ダブルポインタを渡している。ダブルポインタは単一ポインタへの単一ポインタなので、voidポインタが必要な関数に渡すことができます。
実際に配列をコピーする必要があるため、 void*
。 memcpy
が呼び出された場合、のような、
lptr->array = memcpy(*(lptr->array), *(list->array), list->size*sizeof(void*));
その後、
は成功し、コピー操作をmemcpy
実行していますか?ディープコピーを実行するには?
アレイストアを 'array'または配列**と**にコピーする必要があります。それぞれの' void * 'ポインタが指し示す内容は? – chux
@chux配列とそれぞれのvoid *ポインタが指し示す内容。 Imeanディープコピー。確かに、 'void ** array = NULL'が必要でした。 – overexchange
'lptr-> array [0]、lptr-> array [1]、...'が指すデータのサイズはどこですか?ディープコピーを行うには、 'array'のサイズが(' size'で)必要であるだけでなく、各 'lptr-> array [i]'が指すデータのサイズが必要です。おそらく別のフィールドですか? 'size_t * array_size'? – chux