我正在尝试实现一个函数,该函数使用指向结构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("%dn", data1->item);
printf("End");
return 0;
}
然而,如果我注释行printf("%dn", data1->item);
,则程序正常运行,并且我得到输出"0";结束";。为什么会发生这种情况?
编辑
如果我有一个集合,并将其传递给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("%dn", cltn->one->item);
printf("End");
return 0;
}
提前感谢。
C中没有引用。有一种不同的类型将地址作为其值。
data1包含作为参数传递的任何内容的副本。由于您传递了一个地址,它将有该地址的副本,当您使用运算符*更改存储在那里的地址时,这些更改将反映在您调用的参数中。
看看下面的行:
data1 = tmp;
您正在更改存储在data1中的地址,该地址将不再与传递的参数相同。一旦函数完成,data1就不再存在,参数将具有相同的地址。
当您在参数中放入第二个*时,通过在函数中使用*,您可以更改传递给它的变量的地址:
通过将函数签名更改为:
void changeVal(data **data1)
假设你打电话给
data *d;
changeVal(&d);
如果您使用*运算符访问函数内部:
*data1 = malloc...
这将是相同的,如果你在主要使用d:
d = malloc...
您应该使用pass结构的地址,如下所示。
#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));
//make sure to check whether proper memory is allocated
if(tmp)
{
printf("allocated mem for tmp is %un", tmp);
tmp->item = value;
tmp->count = 10;
*data1 = tmp;
*data2 = tmp;
}
else
{
printf("malloc failedn");
}
}
int main()
{
data *data1 = NULL;
data *data2 = NULL;
printf("before memory allocation data1 is %un", data1);
changeVal(&data1, &data2, 39);
printf("%dn", data1->item);
printf("after allocated memory data1 is %un", data1);
// free the allocated memory
free(data1);
data1 = NULL;
data2 = NULL;
printf("End");
return 0;
}