2016-12-02 9 views
0

構造体内で構造体配列を操作しているときにこの問題が発生しました。私はmemcpyを使ってdictに配列を設定しようとしています。私は期待値といくつかの一見ランダムな整数を出力として混合しています。memcpy()とmemmove()が期待通りに動作しない

私はいくつかのオンラインコンパイラでこのコードを試してみましたが、うまくいきました。私はそれがメモリ領域のオーバーラップと関係しているかもしれないと思ったので、memmove()を試みましたが、結果は同じでした。

私はdictにmallocを不適切に使用している可能性がありますが、わかりません。内部配列や個々の要素にはmallocを使用できないようです。私はどんな助けにも感謝しています。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct{ 
    int i; 
} entry; 

typedef struct{ 
    entry e[10]; 
    int i; 
} dict; 

dict* d; 

void test(dict* di){ 
    printf("%d\n", di->i); 
    int k; 
    for (k = 0; k < 10; k ++){ 
     printf(("%d\n"),di->e[k].i); 
    } 
} 

int main(){ 
    entry en[10]; 

    d = malloc(sizeof(d)); 

    int k; 
    for (k = 0; k < 10; k++){ 
     en[k].i = k; 
    } 

    d->i = 50; 
    memcpy(d->e, en, 10*sizeof(entry)); 

    test(d); 

    return 0; 
} 
+2

'd'はポインタです。そして、あなたは構造体ではなくポインタのサイズを取得しています。 'sizeof(dict)'を使う。 –

+4

ポインタ 'd 'が指す単一のオブジェクトに対する' malloc'-ingメモリのidomaticな方法は 'd = malloc(sizeof * d)'です。あなたのコードで '*'はどうなりましたか? – AnT

+1

@Paul Rooney:OPのコードに 'struct dict'のような型はありません。 – AnT

答えて

6
d = malloc(sizeof(d)); 

ddict*あります。 sizeof dsizeof(dict*)です。あなたがsizeof *dを意味するように見えます。

+0

それはそうだった、ありがとう! –

関連する問題