2015-01-11 29 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