在c中的函数中复制二维数组时遇到问题。下面是代码:

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++;
   }

}

下面是structs Lista和element
typedef struct element
{
   char* secuencia;
   struct element* next;
   struct element* prev;
   int** estado;
}element;

typedef struct Lista
{

   int cantidad;
   element* last;

}Lista;

这个想法是在list a中添加“elements”,它是一个基本列表,返回最后添加的元素。问题是,list中存储的每个元素都返回相同的“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错误,但是我一直有问题(当我修改一个数组时,其他数组得到修改)
编辑2
所以,我开始检查代码,在调用Add()之前,数组的赋值不正确(总是将同一个数组传递给函数),对EDIT1的修改解决了我的问题。
PS2:我会深入调查指针,谢谢

最佳答案

指向指针的地址,而不是指向的内存。请改为:

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

如果你想在主题周围阅读,请注意指针的指针。
此外,正如一些注释所指出的,双指针与二维数组不同。查看this answer on creating a pointer to a 2D array。你想在代码中做类似的事情。memcpy应该是指向双数组的指针。

关于c - memcpy()无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37572456/

10-13 07:10