簡體   English   中英

如何將結構成員數組復制到變量?

[英]How can I copy a struct member array to a variable?

我有以下基本 C 示例:

#include <stdio.h>

struct Example {
    double arr[4][4];
    int size;
};

int main()
{
    struct Example e = {
        {{1., 0., 0., 0.},
         {0., 1., 0., 0.},
         {0., 0., 1., 0.},
         {0., 0., 0., 1.}},
         4
    };
    double** arr = e.arr;

    printf("%8.5f %8.5f %8.5f %8.5f\n", arr[0][0], arr[0][1], arr[0][2], arr[0][3]);
    printf("%8.5f %8.5f %8.5f %8.5f\n", arr[1][0], arr[1][1], arr[1][2], arr[1][3]);
    printf("%8.5f %8.5f %8.5f %8.5f\n", arr[2][0], arr[2][1], arr[2][2], arr[2][3]);
    printf("%8.5f %8.5f %8.5f %8.5f\n", arr[3][0], arr[3][1], arr[3][2], arr[3][3]);
}

我該怎么做才能使printf成功打印出矩陣中的值? 如果我將arr聲明為double** ,則會出現段錯誤。 如果我嘗試使用double* ,那么當我嘗試進行雙索引時它會抱怨。 我也嘗試過double arr[4][4] = e.arr ,但編譯器只是告訴我這是一個無效的初始化程序。 這樣做的正確方法是什么?

(我意識到在這個例子中size是多余的,我只是希望結構有多個成員。)

您可以這樣做,因為 double arr[4][4] 的值在 memory 中是連續的

double* arr = e.arr[0]; // points to first value

printf("%8.5f %8.5f %8.5f %8.5f\n", arr[0], arr[1], arr[2], arr[3]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr[4], arr[5], arr[6], arr[7]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr[8], arr[9], arr[10], arr[11]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr[12], arr[13], arr[14], arr[15]);

或者,正如@ismick 在他的評論中指出的那樣,你可以這樣寫

double (*arr2)[4] = e.arr ;

printf("%8.5f %8.5f %8.5f %8.5f\n", arr2[0][0], arr2[0][1], arr2[0][2], arr2[0][3]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr2[1][0], arr2[1][1], arr2[1][2], arr2[1][3]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr2[2][0], arr2[2][1], arr2[2][2], arr2[2][3]);
printf("%8.5f %8.5f %8.5f %8.5f\n", arr2[3][0], arr2[3][1], arr2[3][2], arr2[3][3]); 

如果你想要那種語法。

除了@AndersK 給出的答案,你也可以試試這個。

#include <stdio.h>

struct Example {
    double arr[4][4];
    int size;
};

int main()
{
    int i, j;
    struct Example e = {
        {{1., 0., 0., 0.},
         {0., 1., 0., 0.},
         {0., 0., 1., 0.},
         {0., 0., 0., 1.}},
         4
    };
    double *arr = (double *)e.arr;

    for(i = 0; i < 4; ++i)
    {
        for(j = 0; j < 4; ++j)
            printf("%8.5f ", *(arr+i*4+j));
        putchar('\n');
    }
    return 0;
}

在此,我們指向存儲e.arr[0]的 memory 的第一個塊,然后使用此表達式(arr+i*4+j)遍歷連續的 memory 位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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