c中带指针的结构简单求和

simple sum in structure with pointer in c

最近我开始用c语言编写应用程序。我在下面的代码中遇到求和运算符的问题。当我开始计划并为前任付出时。 4 到 int a;和 6 到 int b;然后我想要 a+b 给我 22。这是代码,首先我定义我的结构:

struct student {
   int a;
   int *b;
}*s1;

然后我扫描值和其他步骤:

int sum, x, y;
s1 = malloc(sizeof(struct student));

scanf("%d", &x);
scanf("%d", &y);

s1->a = x;
s1->b = y;
sum = (s1->a) + (s1->b);
printf("SUM: %d", sum);

我也测试了 *(s1->a) 但仍然有问题。谢谢

IMPORTANT: i don't want the other ways that i can solve this problem or suggesting the better ways of coding this algorithm, i just want to know why this piece of code not working properly and how can i fix it. Actually i want keep the 'b' as a pointer!

你的问题出在结构的定义上and/or你是如何使用它的:

struct student {
   int a;
   int *b;
}*s1;

这里 a 是一个 intb 是一个指向 int 的指针。如果 x 具有该结构类型,则需要使用 x.a*(x.b) 来引用整数。因此,如果 s 是指向结构的指针,则需要使用 s->a*(s->b).

但是,您正在使用 s1 作为指向结构的指针,但试图使用 s->as->b 似乎都是整数。由于您声明结构的方式,这将不起作用。

更准确地说:

s1->a = x;
s1->b = y;
sum = (s1->a) + (s1->b);
printf("SUM: %d", sum);

那条总和线正在做 pointer arithmetic(因为 s1->b 是一个指针)。这不太可能是您所需要的。从定义中删除 *,即使用:

struct student {
   int a;
   int b;
} *s1;

您无需更改 malloc() 结构的方式。 s1 是指向结构的指针这一事实与结构 是否包含 指针是一个独立的问题。

int *b 在你的结构中是一个指针而不是 int。要修复您的代码,您可以将 y 的地址分配给这样的指针:

s1->a = x;
s1->b = &y;
sum = (s1->a) + *(s1->b); //asterisk dereferences the pointer and gets the value stored in the memory address
printf("SUM: %d", sum);

或者只是将 b 声明为 int 变量。

正如@Mitch Wheat 在评论中提到的,

struct student {
   int a;
   int *b; // <-- this is a pointer, not an int
}*s1;

这在表达式

中的效果
(s1->a) + (s1->b);

使用了指针算法,如果 s1->b 是一个有效的指针,则表达式的值与 &s1->b[s1->a] 的值相同(这不是在代码)。

既然s1->a == 4s1->b == memory address 6,那么(s1->a) + (s1->b)的数值就是6 + sizeof(int) * 4。如果 sizeof(int) == 4,这将变为 22,这就是您得到的行为。

解决方案是让b成为一个整数:

struct student {
   int a;
   int b;
}*s1;

请注意,这只是对您获得的行为的描述,而不是对您保证获得的行为的描述。例如,在指针大小与 ints 不同的平台上,printf 将无法按预期工作,因为指定的 %d 格式不使用整个指针值。