C无法将值赋给struct字段

时间:2013-04-29 15:14:14

标签: c

我正在尝试使用init()函数初始化struct值。 它看起来不错,但不知何故,当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

我无法理解我做错了什么。请帮忙。

2 个答案:

答案 0 :(得分:4)

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

在这里,您将malloc()的返回值赋给data变量,因此它会遮蔽(覆盖)其原始值(即您传入的结构的地址)。 您根本不需要这一行,因为您已经传入了(stack-)已分配结构的地址。

说明:

  1. You should not cast the return value of malloc()

  2. 在你不需要的行上,当函数返回时你实际上松开了指向malloc()内存的指针,所以你甚至会泄漏内存。

答案 1 :(得分:0)

让我们看一下这几行:

init_data(&test_data);

在这里你调用init_data(我假设它实际上是init_svm_data),指向我认为是正常结构的指针,即你全局声明svm_data_t test_data;

然后在init_svm_data中执行:

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

在这里覆盖传递给函数的指针。

这会导致一些问题:首先是init_svm_data中的指针是函数的 local ,因此对它的更改(赋值)将不会在{ {1}}。第二个问题是,如果我正确地使用init_svm_data的声明猜测,则不需要分配这个内存,因为它已经由编译器完成了。