2012-04-15 4 views
-1

私はいくつかの株式市場データを保存するクラスプロジェクトのリンクリストを作成しています。私はヒープにmallocingの代わりにいくつかのデータをスタックに格納しようとしていました。私はmemcpyを使ってこれをしようとしています。私のコードは次のようである:私は新しいノードを作成し、私はそれのためのスペースををmallocする必要があるときmallocingの代わりにmemcpyを使用してスタックに領域を保存する

struct trade{ 

int a,b; 
float c; 
struct trade *n; 
}; 
char stack[100]; 
int i = 0; 

void newNode(struct trade **head, int a, int b, float c){ 
struct trade *node; 
if(i<99){ 
    memcpy(&a,&stack[i],4); 
    i = i + 4; 
    node = (struct lnode*) malloc(16); 
} 

    else 
    node = (struct lnode*) malloc(20); 
} 
..... 
..... 
} 

マイnewnode関数が呼び出されます。

スタック配列にまだ空きがある場合は、スタック配列にintをコピーします。それ以外の場合は、ヒープにmallocします。私は20と16を使用する理由は、私はスタックにintを格納しているので、私は20バイトのmallocスペースの他の私の構造体の残りの16バイトのmallocスペースが必要です。

何らかの理由で私はこれを行うときにセグメンテーションを取得します。誰かが私を正しい方向に向けることができたら、私はそれを感謝します。

ありがとうございます!

+3

'i'が' 96'で 'int'の4番目のバイトがmemcpy() 'dのときはどうなりますか? – user268396

+0

まあ私は96になることはできません。インデックスが0から始まり、4だけインクリメントするので、95になり、4番目のバイトをコピーするとスタック配列の終わりに達し、内部には入りませんそのifステートメントはもう – AndroidDev93

+1

なぜあなたはそれをこのようにしようとしていますか? –

答えて

3
  1. memcpyの引数を入れ替えました。あなたは32ビットx86が、何のためにコンパイルしている場合は、整数とポインタは4つのバイトではありません

    SYNOPSIS 
    
    void * memcpy(void *restrict s1, const void *restrict s2, size_t n); 
    
    DESCRIPTION 
    
    The memcpy() function copies n bytes from memory area s2 to memory area 
    s1. If s1 and s2 overlap, behavior is undefined. Applications in which 
    s1 and s2 might overlap should use memmove(3) instead. 
    
  2. 、しかし:manページから

    memcpy(&stack[i],&a,4); 
    

    :先には、最初の引数でなければなりません例えば8が64ビットの場合、問題が発生します。実際にsizeof(int)を使用する必要があります。これはまた、16と20にも影響します。これはおそらくsizeof(lnode)と置き換えることができます。これらはコンパイル時に正しい値に設定されるため、速度には影響しません。

  3. 「スタック」とヒープの定義以外の問題:なぜintを入れるのであれば、intではなくchar配列としてスタックを定義するのはなぜですか? char配列を使うことは可能ですが、同じ型の配列にmemcpyを割り当てるのではなく、ずっと簡単でエラーを起こしにくいです。

  4. Valgrindはこの種のデバッグの友人です。私はsegfaultsとメモリリークのための標準的なデバッグツールとしてそれを使用しています。

+0

int配列を持つことができるときに、char配列にintをコピーしようとする一般的な奇妙さについて言及したいと思います... – user268396

関連する問題