gpt4 book ai didi

c - 函数执行后结构体数组中的值丢失

转载 作者:行者123 更新时间:2023-11-30 15:30:25 24 4
gpt4 key购买 nike

我正在编写一个 C 代码,该代码包含一个结构,该结构承载一些我称之为范围的值。

我的目的是动态使用这个所谓的范围(在每次执行时保存不同数量的数据)。我现在暂时使用 #define comp 代替。每次我通过使用 s1 结构(和内存分配)调用 update_range 时,这个所谓的范围都会更新。

我发现奇怪的是,当我引入“show_range”函数来输出更新函数内部/外部的实际值时,我意识到我丢失了前两个值。这是代码。对此有何建议?提前致谢!

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <complex.h>
#define comp 1024

// struct holding a complex-valued range
struct range {
int dimensions; /* number of dimensions */
int* size; /* array holding number of points per dimension */
complex double* values; /* array holding complex valued */
int components; /* number of components that will change on any execution*/
};

// parameters to use in function
struct s1 {
int tag;
struct range* range;
};

int update_range(struct s1* arg);
int show_range(struct range* argrange, char* message);
int copy_range(struct range* in, struct range* out);

int main(void) {
int ret = 0;
struct s1 s1;
s1.tag = 0;
s1.range = malloc(sizeof(struct range));
update_range(&s1);
show_range(s1.range, "s1.range inside main function");

return ret;
}

////////////////////////////////////////////
int update_range(struct s1* arg) {
int ret = 0;
int i;
struct range range;
range.dimensions = 1;
range.size = malloc(range.dimensions * sizeof(int));
range.components = comp;
range.size[0] = range.components; // unidimensional case
range.values = malloc(range.components * sizeof(complex double));
for (i = 0; i < range.components; i++) {
range.values[i] = (i + 1) + I * (i + 1);
}
show_range(&range, "range inside update_range function");

arg->range->size =
malloc(range.dimensions * sizeof(int)); // size was unknown before
arg->range->values =
malloc(comp * sizeof(complex double)); // amount of values was unknown
copy_range(&range, arg->range);
show_range(arg->range, "arg->range inside update_range function");

if (range.size)
free(range.size);
range.size = NULL;
if (range.values)
free(range.values);
range.values = NULL;
return ret;
}

////////////////////////////////////////////
// Show parameters (10 first values)
int show_range(struct range* argrange, char* message) {
int ret = 0;
vint i;
printf(" ******************************\n");
printf(" range in %s \n", message);
printf(" arg.dimensions=%d \n", argrange->dimensions);
printf(" arg.size[0]=%d \n", argrange->size[0]);
printf(" argrange.components=%d \n", argrange->components);
printf(" first 10 {Re} values: \n");
for (i = 0; i < 10; i++) {
printf(" argrange.values[%d]=%f\n", i, creal(argrange->values[i]));
}
printf("\n");
return ret;
}

////////////////////////////////////////////
// copy range
int copy_range(struct range* in, struct range* out) {
int ret = 0;

if (in == NULL) {
fprintf(stderr, "error: in points to NULL (%s:%d)\n", __FILE__,
__LINE__);
ret = -1;
goto cleanup;
}
if (out == NULL) {
fprintf(stderr, "error: out points to NULL (%s:%d)\n", __FILE__,
__LINE__);
ret = -1;
goto cleanup;
}

out->dimensions = in->dimensions;
out->size = in->size;
out->values = in->values;
out->components = in->components;

cleanup:
return ret;
}

最佳答案

您的 copy_range 函数已损坏,因为它仅复制指向大小和值的指针,而不复制内存。在调用 free(range.size);free(range.values); 后,您也会从原始对象中删除 mamory,但不会将其指针设置回 NULL。

调用 update_range 后,s1.range 的大小和值都为非 NULL 指针,但它们指向已删除的内存。

关于c - 函数执行后结构体数组中的值丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com