memcpy()无法正常工作

时间:2016-06-01 15:07:05

标签: c arrays list struct memcpy

我在c中的函数中复制2D数组时遇到问题。这是代码:

void Add(Lista* list,int** estado, char* sec, int size)
{

   if(list->last==NULL)
   {
    list->last = calloc(1,sizeof(element));
    list->last-> secuencia = sec;
    list->last->next = NULL;
    list->last->prev = NULL;
    list->last-> estado = (int**)calloc(size,sizeof(int));
    memcpy(&list->last->estado,&estado,size*sizeof(int));

    list->cantidad++;
   }
   else
   {    
    list->last-> next = calloc(1,sizeof(element));
    list->last-> next -> secuencia = sec;
    list->last->next->next = NULL;
    list->last->next->prev = list->last;
    list->last =list->last->next;
    list->last->estado = (int**)calloc(size,sizeof(int));
    memcpy(&list->last->estado,&estado,size*sizeof(int));
    list->cantidad++;
   }

}

以下是结构Lista和元素

typedef struct element
{
   char* secuencia;
   struct element* next;
   struct element* prev;
   int** estado;
}element;

typedef struct Lista
{

   int cantidad;    
   element* last;

}Lista;

想法是添加"元素"在Lista中,它是一个返回最后添加元素的基本列表。问题是存储在列表中的每个元素都返回相同的" estado" (2D int数组),如果我修改其中一个元素estado,那么每个元素estado都会得到相同的修改。所以,我不知道问题出在哪里,因为memcpy()应该复制值,然后使两个数组彼此独立,对吗?

PS:对不起,如果说得不好,我会说西班牙语

修改

因此,我根据对此的答案更改了我的代码:

void Add(Lista* list,int** estado, char* sec, int size)
{

   if(list->last==NULL)
   {
    list->last = calloc(1,sizeof(element));
    list->last-> secuencia = sec;
    list->last->next = NULL;
    list->last->prev = NULL;
    list->last-> estado = (int**)calloc(size,sizeof(int));
    memcpy(list->last->estado,estado,size*sizeof(int));

    list->cantidad++;
   }
   else
   {    
    list->last-> next = calloc(1,sizeof(element));
    list->last-> next -> secuencia = sec;
    list->last->next->next = NULL;
    list->last->next->prev = list->last;
    list->last =list->last->next;
    list->last->estado = (int**)calloc(size,sizeof(int));
    memcpy(list->last->estado,estado,size*sizeof(int));
    list->cantidad++;
   }

}

现在我没有valgrind错误,但我一直遇到问题(当我修改一个数组时,其他人得到修改)

EDIT2

所以,我开始检查代码,在调用Add()之前,有一个不正确的数组赋值(总是将相同的数组传递给函数),并且修改EDIT1解决了我的问题。

PS2:我会深入研究指针,谢谢

2 个答案:

答案 0 :(得分:3)

你的memcpy - 指向一个指针的地址,而不是它指向 的内存。试试这个:

memcpy(list->last->estado,estado,size*sizeof(int));

如果你想阅读这个主题,请查看指针指针。

另外,正如一些评论所指出的,双指针与2D数组不同。查看this answer on creating a pointer to a 2D array。您希望在代码中执行类似的操作。 estado应该是指向双数组的指针。

答案 1 :(得分:1)

memcpy(list->last->estado,estado,size*sizeof(int));的类型/大小不一致。

estadoint**类型 list->last->estado类型为int**,与estado(好)相同 size*sizeof(int) size乘以错误的size元素。

而不是int,它应该是2指针指向的类型。 (int*

建议以下内容以避免错误的尺寸元素。

memcpy(list->last->estado,estado,size*sizeof *(list->last->estado));

calloc()同样的问题:错误的尺寸。也不需要演员。

// list->last->estado = (int**)calloc(size,sizeof(int));
list->last->estado = calloc(size, sizeof *(list->last->estado));

// For consistency
// list->last-> next = calloc(1,sizeof(element));
list->last-> next = calloc(1,sizeof *(list->last-> next));