簡體   English   中英

在函數中傳遞參數以將結構值轉換為數組

[英]Passing an argument in the function to turn struct values into an array

我將函數void Assign_numbers傳遞給void Adding 當我將其更改為一個指針和編譯,所述第一陣列值返回從相同的值number.avoid 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM