我正在尝试使用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
我无法理解我做错了什么。请帮忙。
答案 0 :(得分:4)
data = (void*)malloc(sizeof(svm_data_t));
在这里,您将malloc()
的返回值赋给data
变量,因此它会遮蔽(覆盖)其原始值(即您传入的结构的地址)。 您根本不需要这一行,因为您已经传入了(stack-)已分配结构的地址。
说明:
在你不需要的行上,当函数返回时你实际上松开了指向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
的声明猜测,则不需要分配这个内存,因为它已经由编译器完成了。