-1

init() 関数で構造体の値を初期化しようとしています。良さそうに見えますが、init() 関数の実行が終了すると、どういうわけか割り当てられません。さらに、 init() 関数内ではすべて問題ありませんが、返されると割り当てられた値が失われます。数時間を費やしましたが、何が起こっているのかわかりません。
ここに私のコードと構造体があります:

typedef struct svm_data
{
    int num_points;
    int num_dimensions;
    double* training_set;    
    double* descision_set;   
} svm_data_t;

void init()
{
  init_data(&test_data);
  init_data(&check_data);

  printf("in init: test_data->num_dimensions: %d\n", test_data.num_dimensions); 
  printf("in init: check_data->num_dimensions: %d\n", check_data.num_dimensions); 
  set_correct_descision_set(&check_data);
}

void init_svm_data(svm_data_t* data)
{
  int np = 3;
  int nd = 3;
  data = (void*)malloc(sizeof(svm_data_t));
  data->num_points = np;
  data->num_dimensions = nd;

  data->training_set = (void*)malloc(sizeof(double)*(NUM_DIMENSIONS+1));
  data->descision_set = (void*)malloc(sizeof(double)*(NUM_DIMENSIONS+1));

  printf("test_data->num_dimensions: %d\n", data->num_dimensions);
}

これは以下を出力します:

test_data->num_dimensions: 3
test_data->num_dimensions: 3
in init: test_data->num_dimensions: 0
in init: check_data->num_dimensions: 0

でも印刷したい

test_data->num_dimensions: 3
test_data->num_dimensions: 3
in init: test_data->num_dimensions: 3
in init: check_data->num_dimensions: 3

私が間違っていることを理解できません。助けてください。

4

2 に答える 2

4
data = (void*)malloc(sizeof(svm_data_t));

malloc()ここでは、変数にの戻り値を割り当てているdataため、元の値 (つまり、渡した構造体のアドレス) がシャドウ (上書き) されます。(スタックに) 割り当てられた構造体のアドレスを既に渡しているため、この行はまったく必要ありません。

備考:

  1. の戻り値をキャストしないでくださいmalloc()

  2. 必要のない行ではmalloc()、関数が戻ったときに実際に割り当てられたメモリへのポインタを失うため、メモリリークさえします。

于 2013-04-29T15:18:22.217 に答える
0

ここでいくつかの行を見てみましょう:

init_data(&test_data);

ここでは、通常の構造体であると想定するものへのポインタを使用して呼び出しますinit_data(実際には であると想定します)。つまり、 をグローバルに宣言します。init_svm_datasvm_data_t test_data;

次に、次のinit_svm_dataことを行います。

data = (void*)malloc(sizeof(svm_data_t));

ここで、関数に渡すポインターを上書きします。

これにより、いくつかの問題が発生します。1 つ目は、 のポインターが関数に対してローカルであるため、ポインターinit_svm_data変更 (代入) が の外部では認識されないことですinit_svm_data。2 番目の問題は、 の宣言を正しく推測した場合test_data、コンパイラによって既に割り当てられているため、このメモリを割り当てる必要がないことです。

于 2013-04-29T15:20:58.733 に答える