[英]Passing an argument in the function to turn struct values into an array
我將函數void Assign_numbers
傳遞給void Adding
。 當我將其更改為一個指針和編譯,所述第一陣列值返回從相同的值number.a
在void Assign_numbers
。 從ptr[1]
開始的數組中的另一個值給出了一個完全不同的數字。 能否請您幫我,以便陣列能夠輸出其他分配的數字。 請不要更改格式。
#include <stdlib.h>
#include <stdio.h>
#define Max 6
struct Numbers
{
double a,b,c,d,e,f;
};
void Adding(struct Numbers *ptr)
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding(&number);
}
void Adding(struct Numbers *ptr)
{
int i =0;
for(i;i<Max;i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
int main()
{
Assign_numbers();
return 0;
}
在Adding
函數中,變量ptr
指向單個結構,實質上是單個元素的數組。 例如,當執行ptr[1]
您嘗試訪問此單元素數組中的第二個元素,該元素超出范圍,將導致未定義的行為 。
根本無法將標准C中的結構像數組一樣對待。
雖然有黑客 。 例如,使用將結構作為一個成員的聯合,將數組作為另一個成員,但是這依賴於編譯器在結構的成員之間不添加任何填充。 它既不便攜也不推薦。
指針的類型(在您的情況下為struct Numbers
)定義數組中元素的偏移量。 例如,如果你有一些類型的數組T
使用的a[i]
將意味采取值T
從地址a + i * sizeof(T)
或simplier。
注意:確實, a[i]
將被轉換為*(a + i)
,這就是i[a]
運行良好的原因。 請參見使用數組,為什么a [5] == 5 [a]? 題。
現在,您有了struct Numbers *ptr
並使用ptr[0]
使其成為*(ptr + 0 * sizeof(struct Numbers))
,這將您帶到內存中的結構。 但是,使用ptr[1]
會導致*(ptr + 1 * sizeof(struct Numbers))
,但是內存中此地址上沒有數據,這會導致未定義的行為。
您想要做的是使用double*
遍歷結構,例如
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding((double*)&number);
}
void Adding(double* ptr)
{
int i = 0;
for(i; i < Max; i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
版畫
45.78
81.45
56.69
34.58
23.57
78.35
另一種方法是使用union
。 看到C方法像數組一樣遍歷結構的成員嗎? 例如。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.