c-未更新的结构指针的值



我正在尝试实现一个函数,该函数使用指向结构data1data2的两个指针并更新它们的值。

这是我尝试过的,但我得到了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;
}

相关内容

  • 没有找到相关文章

最新更新