gpt4 book ai didi

c - 我不明白为什么每次调用此函数后头节点都会不断变化

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

我正在尝试编写一个程序,将矩阵的非零元素的输入流表示为压缩稀疏表示。每次在主函数中遇到新的非零数字时,都会调用函数 csr。 printf 语句在每次调用该函数后都会给我不同的值。除了列表为空的第一个 if 语句之外,头 node(v_h & a_h) 不会在任何地方更新。 'a' 和 vre_ar 类型的两个链表。 ia 已使用 ia[i].a=NULL 进行初始化,其中 i:0,n-1

struct re_ar{
float x;
struct re_ar *nxt;
}; //structure for each node of a list containing real numbers

typedef struct re_ar re_ar;

struct in_ar{
re_ar *a;
re_ar *v;
}; //structure for each node of an array containing pointers to two lists of type re_ar

typedef struct in_ar in_ar;
in_ar *ia; //ia is an array
re_ar *a_h=NULL;re_ar *a_t=NULL;
re_ar *v_h=NULL;re_ar *v_t=NULL; //a_h, v_h are head nodes for lists a & v
int n; //a_t, v_t are tail nodes
void csr(float d, int r_i, int c_i) //r_i-row number, c_i-column number, d- entry
{
re_ar a_n;
re_ar v_n; //a_n v_n are new nodes

a_n.nxt = NULL;
v_n.nxt = NULL;
a_n.x = d;
v_n.x = c_i; //assigning data to both nodes

if(a_h == NULL) //Checking if the list is empty
{
a_h = &a_n;
v_h = &v_n;
a_t = &a_n;
v_t = &v_n; //Connecting head and tail nodes to the first node
(ia[r_i].a) = &a_n;
(ia[r_i].v) = &v_n; //Pointing ia[r_i] to the first node of both the lists
}
else //For non-empty cases
{
a_t->nxt=&a_n;
a_t=&a_n;
v_t->nxt=&v_n;
v_t=&v_n; //Adding nodes to the list
if(ia[r_i].a==NULL) //Checking if ia[r_i] has been already pointed to a node
{
ia[r_i].a=&a_n;
ia[r_i].v=&v_n; //Connecting ia[r_i] to the current node
}
}

printf("%f", v_h->x);
}

最佳答案

问题代码的问题在于栈上构建了新的节点。
(如“布雷特·黑尔”所示)

re_ar a_n;
re_ar v_n;

由于 a_n 和 v_n 是“自动”堆栈变量,因此它们的范围(和存在)仅限于它们所在的函数。当csr()函数返回时,a_n和v_n占用的内存将被其他堆栈结构使用。

也许为堆上的新节点分配存储是合适的;像这样的东西:

re_ar *a_n = NULL;
re_ar *v_n = NULL;

a_n=malloc(sizeof(*a_n));
if(NULL == a_n)
/* Handle malloc() failure here. */;

v_n=malloc(sizeof(*a_n));
if(NULL == v_n)
/* Handle malloc() failure here. */;

a_n->nxt = NULL;
v_n->nxt = NULL;
a_n->x = d;
v_n->x = c_i;
...

然后,新的列表节点将在 csr() 的生命周期结束后持续存在。

关于c - 我不明白为什么每次调用此函数后头节点都会不断变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645639/

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