2016-06-01 7 views
0

cの関数で2D配列をコピーできません。ここでは、コードは次のとおりです。memcpy()が正しく動作しない

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

} 

ここでは、構造体リスタと要素

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

typedef struct Lista 
{ 

    int cantidad;  
    element* last; 

}Lista; 

があるという考えはリスタの「要素」を追加することで、それは最後に追加された要素を返す基本的なリストです。問題は、リストに格納されているすべての要素が同じ "estado"(2D int配列)を返すことです。要素estadoのいずれかを変更すると、すべての要素estadoは同じ変更を行います。ですから、memcpy()は値をコピーして、両方の配列を互いに独立させなければならないので、どこに問題があるのか​​分かりません。

PS:それはうまく説明されていなかった場合は申し訳ありませんが、私が話すスペイン語

EDIT

だから、私は変更するには、このへの回答に基づいて、私のコード:今すぐ

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

} 

Iエラーを起こしていないが、私は問題を抱えている(あるアレイを変更すると、他のアレイは変更を受ける)

EDIT2

だから、私は、コードをチェックし始め、コールが追加する前に、()配列の不正確な逢引があったことは、(常に関数に同じ配列を渡される)とEDIT1の変更は私の問題を解決しました。

PS2:私は、ポインタに深く感謝

+3

'int **'は 'int'の2次元配列を指すのではなく、' int'のポインタへのポインタを指します。 – alk

+0

'int'の配列を指すポインタの配列を使用していますか?または、行と列から適切な要素を見つけるために余分な数学を使って1つのチャンクにすべて割り当てられていますか? – Dmitri

+0

@Dmitriそれは数字で作成された最初のものを除き、すべて1つのチャンクに割り当てられます(私は.txtファイルから取得しました) –

答えて

3

あなたmemcpyはそれがをINGのポイントだポインタのアドレスではなく、メモリ上に-ingを見ていきます。代わりにこれを試してみてください:

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

この件については、読んでみたい場合は、ポインタのポインタを参照してください。

また、いくつかのコメントで指摘されているように、ダブルポインタは2D配列と同じではありません。 this answer on creating a pointer to a 2D arrayをチェックしてください。あなたはあなたのコードのような何かをしたい。 estadoは、代わりに二重配列へのポインタでなければなりません。

+2

これは、ポインタへのポインタとポインタへのポインタの違いを知ることが重要である理由の1つです。 –

+2

'estado'がintポインタの配列を指しているにもかかわらず、このコードは' sizeof(int) 'を使用しているので、これは正しくありません。 – 2501

+0

これはうまくいっていますが、それでもすべての "エスタド"で同じ値を得ます。 –

1

memcpy(list->last->estado,estado,size*sizeof(int));は、タイプ/サイズに一貫性がありません。

estadoint**
list->last->estado
size*sizeof(int)が間違ったサイズの要素によって乗算さsizeint**estado(良い)と同じタイプであるタイプです。

intではなく、2つのポインタが指すタイプである必要があります。 (int*

誤ったサイズの要素を避けるために、以下を推奨します。calloc()ため

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

同じ問題:間違ったサイズ。キャストの必要もありません。

// 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)); 
+1

私はOPがさらに混乱すると思います。コードは技術的には正しいですが、ポインタだけをコピーすることは意図した動作であるとは思われません。 – 2501

+1

@ 2501あなたは正しいと思われます。掲載されたOPによって、これは少なくとも適切なサイズを割り当てることになります。コードは 'estado'が(配列として)何を指しているのか、' estado'を複製しているのかは未定です。 – chux

関連する問題