2015-01-11 28 views
0

最近我开始用c语言编写应用程序。我在下面的代码中遇到了sum运算符的问题。当我开始程序,我给予前。 4到int a;和6到int b;然后我想A + B巫婆给我22.这里是代码,首先,我定义我的结构:简单的结构与指针在c结构

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)仍然有问题。谢谢。

重要:我不想,我可以解决这个问题或建议编码算法的更好的方法的其他方式,我只是想知道为什么这段代码不工作正确,我该如何解决它。其实我想保留'b'作为指针!

+0

int * b; < - 这是一个int指针,而不是一个int ... –

+0

@MitchWheat所以我怎么能malloc b? –

+0

erm,使用malloc !!! –

回答

0

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); 

或者只是宣布bint变量。

+0

(s1 - > * b)是否为真?我的编译器不允许我这样的语法。 –

+0

对不起。尝试编辑代码 –

+0

谢谢。好的回答 –

0

你的问题出在结构和/或定义你如何使用它:

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

这里aintb是一个指向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是一个指向结构体的指针是一个单独的问题,它与结构体是否包含指针有关。

1

如@米奇小麦评价所提到的,

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

这具有在表达式

(s1->a) + (s1->b); 

指针运算使用的效果,并且表达具有相同的值作为&s1->b[s1->a]将如果s1->b是有效的指针(它不是在代码中未触发的问题)。

因为s1->a == 4s1->b == memory address 6,所以(s1->a) + (s1->b)的数值是6 + sizeof(int) * 4。如果sizeof(int) == 4,这将成为22,这就是你得到的行为。

的解决方案是让b一个int:

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

请注意,这只是你的行为的描述,而不是行为的你肯定可以拿到。例如,在指针的大小与int s不同的平台上,printf将无法​​按预期工作,因为指定的%d格式不使用整个指针值。

+0

谢谢你的解释和回答。这是完整的,但我在上面找到我的答案。 s1-> b =&y; (s1-> a)+ *(s1-> b); –

+0

是的,如果你想保持指针,那也可以。请记住,改变'y'然后改变'* s1-> b',反之亦然。 – Wintermute