1

次のように、構造体要素で memset を使用しようとしています。

memset( &targs[i]->cs, 0, sizeof( xcpu ) );

ただし、そうするとセグメンテーション違反が発生します。なぜこれが失敗するのか、どうすればうまくいくのかわかりません。構造体の要素で memset を使用する適切な方法は何ですか? また、私の方法が機能しないのはなぜですか?

ターゲットにメモリを割り当てる行:

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

構造体要素 cs (xcpu_context) および構造体タグ (execute_args) の構造体定義:

typedef struct xcpu_context {
  unsigned char *memory;              
  unsigned short regs[X_MAX_REGS];    
  unsigned short pc;                  
  unsigned short state;              
  unsigned short itr;                 
  unsigned short id;                 
  unsigned short num;                 
} xcpu;

typedef struct execute_args {
    int ticks;
    int quantum;
    xcpu cs;
} eargs;
4

2 に答える 2

2

行にポインターの配列を割り当てました

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

しかし、要素自体を初期化していません。したがって、この segfault は、構造体のフィールドで memset を適切に使用することとは何の関係もありませんが、代わりに uininitialized メモリを使用することから派生します (ポインターの配列を割り当てた後に各 eargs オブジェクトを初期化するためのループがないことを前提としています)。

p代わりに、 eargs オブジェクトの動的配列を割り当てたい場合(ここでは「オブジェクト」という用語を大まかに使用しています)、次のように記述します。

eargs *args = malloc(p * sizeof(eargs));
if (!args) {
    /* Exit with an error message */
}
memset(&(args[i].cs), 0, sizeof(xcpu));

代わりは。argsは動的に割り当てられた eargs オブジェクトの配列であり、動的に割り当てられたポインターの配列ではないことに注意してeargs *くださいeargs **

于 2012-03-08T00:15:14.683 に答える
1

メモリ割り当て行は、構造体へのポインタに対してのみ、構造体にメモリを割り当てません。その配列全体にメモリを割り当てたい場合は、ループを追加して構造体自体にメモリを割り当てる必要があります。

for (i = 0; i < p; i++)
    targs[i] = malloc(sizeof(eargs));

実際操作する構造があれば、memset()呼び出しは問題ないはずです。

于 2012-03-08T00:15:57.447 に答える