-1

株式市場データを格納するクラス プロジェクトのリンク リストを作成しています。ヒープに malloc するのではなく、スタックにデータを格納しようとしていました。私は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 関数が呼び出され、そのためにスペースを malloc する必要があります。

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

何らかの理由で、これを行うとセグメンテーション違反が発生します。誰かが私を正しい方向に向けることができれば幸いです。

ありがとう!

4

1 に答える 1

3
  1. memcpy 引数が交換されました。宛先は最初の引数である必要があります。

    memcpy(&stack[i],&a,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. 32 ビット x86 以外でコンパイルする場合、整数とポインタは 4 バイトではなく、たとえば 64 ビットでは 8 バイトになり、問題が発生します。本当に使うべきsizeof(int)です。これは 16 と 20 にも影響し、おそらく に置き換えることができますsizeof(lnode)。これらはコンパイル時に正しい値に設定されるため、速度には影響しません。

  3. 「スタック」対ヒープの定義に関する問題に加えて、int を入れているのに、スタックを int ではなく char 配列として定義するのはなぜですか? char 配列を使用することは可能ですが、同じ型の配列に memcpy を使用するよりも、割り当てるだけの方がはるかに簡単で、エラーが発生しにくくなります。

  4. Valgrind は、この種のデバッグの友です。セグメンテーション違反やメモリ リークの標準的なデバッグ ツールとして使用しています。

于 2012-04-15T04:48:23.370 に答える