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
是一个 int
但 b
是一个指向 int
的指针。如果 x
具有该结构类型,则需要使用 x.a
但 *(x.b)
来引用整数。因此,如果 s
是指向结构的指针,则需要使用 s->a
但 *(s->b)
.
但是,您正在使用 s1
作为指向结构的指针,但试图使用 s->a
和 s->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 == 4
和s1->b == memory address 6
,那么(s1->a) + (s1->b)
的数值就是6 + sizeof(int) * 4
。如果 sizeof(int) == 4
,这将变为 22
,这就是您得到的行为。
解决方案是让b
成为一个整数:
struct student {
int a;
int b;
}*s1;
请注意,这只是对您获得的行为的描述,而不是对您保证获得的行为的描述。例如,在指针大小与 int
s 不同的平台上,printf
将无法按预期工作,因为指定的 %d
格式不使用整个指针值。
最近我开始用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
是一个 int
但 b
是一个指向 int
的指针。如果 x
具有该结构类型,则需要使用 x.a
但 *(x.b)
来引用整数。因此,如果 s
是指向结构的指针,则需要使用 s->a
但 *(s->b)
.
但是,您正在使用 s1
作为指向结构的指针,但试图使用 s->a
和 s->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 == 4
和s1->b == memory address 6
,那么(s1->a) + (s1->b)
的数值就是6 + sizeof(int) * 4
。如果 sizeof(int) == 4
,这将变为 22
,这就是您得到的行为。
解决方案是让b
成为一个整数:
struct student {
int a;
int b;
}*s1;
请注意,这只是对您获得的行为的描述,而不是对您保证获得的行为的描述。例如,在指针大小与 int
s 不同的平台上,printf
将无法按预期工作,因为指定的 %d
格式不使用整个指针值。