【发布时间】:2021-03-13 18:15:22
【问题描述】:
我正在尝试实现一个函数,该函数接受两个指向结构 data1 和 data2 的指针并更新它们的值。
这是我尝试过的,但我得到了Segmentation fault。
#include <stdio.h>
#include <stdlib.h>
struct data{
int item;
int count;
};
typedef struct data data;
void changeVal(data *data1, data *data2, int value)
{
data *tmp = malloc(sizeof * tmp);
tmp->item = value;
tmp->count = 10;
data1 = tmp;
data2 = tmp;
}
int main()
{
data *data1 = NULL;
data *data2 = NULL;
changeVal(data1, data2, 39);
printf("%d\n", data1->item);
printf("End");
return 0;
}
但是,如果我注释 printf("%d\n", data1->item); 行,程序运行正常,我得到输出“结束”。为什么会这样?
编辑
如果我有一个集合并将其传递给changeVal 函数,则值会更新。这里发生了什么?
#include <stdio.h>
#include <stdlib.h>
struct data{
int item;
int count;
};
typedef struct data data;
struct collection{
data *one;
data *two;
};
typedef struct collection collection;
void changeVal(collection *cltn, int value)
{
data *tmp = malloc(sizeof * tmp);
tmp->item = value;
tmp->count = 10;
cltn->one = tmp;
cltn->two = tmp;
}
int main()
{
collection *cltn;
cltn = malloc(sizeof(cltn));
cltn->one = NULL;
cltn->two = NULL;
changeVal(cltn, 39);
printf("%d\n", cltn->one->item);
printf("End");
return 0;
}
提前致谢。
【问题讨论】:
-
函数应该是
data**,更新应该是*data1 = tmp;。现在你正在更新一个按值传递的变量。 -
@EugeneSh。但为什么?这不是指向结构的指针吗?由于我是初学者,请您解释一下背后的原因。
-
指针是变量,就像其他任何东西一样。为了让你的函数更新某些东西,它需要更新 pointee。也就是说,取一个按值传递的地址,去那个地址,更新那个地址的值。
-
@EugeneSh。为什么在第二种情况下箭头运算符
cltn->one = temp会发生这种情况? (考虑对我的问题进行编辑)。 -
因为您传递了一个指针
cltn并更新它指向的内容,而不是指针本身。
标签: c pointers struct memory-management malloc