-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()当函数返回时,你实际上丢失了指向 ated 内存的指针,所以你甚至泄漏了内存。

于 2013-04-29T15:18:22.217 回答
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));

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

这导致了几个问题:第一个是指针 ininit_svm_data是函数的本地指针,因此对它的更改(分配)在init_svm_data. 第二个问题是,如果我对 的声明 猜对了test_data,您不需要分配此内存,因为它已经由编译器完成。

于 2013-04-29T15:20:58.733 回答