簡體   English   中英

結構初始化期間的靜態數組初始化程序

[英]static array initializer during structure initialization

這是我擁有的兩個結構的簡化版本:

struct MyStruct1 {
    double d;
}

struct MyStruct2 {
    struct MyStruct1* a;
    int i;
}

我可以按如下方式初始化第二個結構:

void InitStruct(struct MyStruct2 pMyStruct2) {
    static struct MyStruct1 A[] = { {.d=12} , {.d=17} , {.d=1} };
    *pMyStruct2 = (struct MyStruct2) { .a = A, .i = 3 };
}

但實際上我必須以這種方式對其進行初始化(它是因為此結構再次是應立即初始化的更大結構的一部分):

void InitStruct(struct MyStruct2 pMyStruct2) {
    *pMyStruct2 = (struct MyStruct2) { 
        .a = (struct MyStruct1[]) {
            {.d=12} , {.d=17} , {.d=1}},
        .i=3 };
}

兩種方式都可以編譯,而不會發出任何警告, 但是第二個解決方案中的數據將被破壞。

我認為內部數組不是靜態的,因此.a指針立即變為無效。

有沒有其他方法可以告訴編譯器將數組的數據保留在內存中?

C99標准 §6.5.2.5p6指出:

復合文字的值是由初始化程序列表初始化的未命名對象的值。 如果復合文字出現在函數主體之外,則對象具有靜態存儲持續時間; 否則,它具有與封閉塊關聯的自動存儲時間。

在這兩種情況下,變量都應正確初始化,並在聲明它們的范圍內有效。

但是,如果按值從函數返回結構,則指針將變為無效。

這是我用於測試的示例代碼。 Valgrind沒有顯示任何錯誤。

#include <stdio.h>

struct MyStruct1 {
  double d;
};

struct MyStruct2 {
  struct MyStruct1* a;
  int i;
};

struct MyStruct1 A[] = { {.d=12} , {.d=17} , {.d=1} };
struct MyStruct2 b1 = { .a = A, .i = 3 };

struct MyStruct2 b2 = { .a = (struct MyStruct1[]) {
                                {.d=12} , {.d=17} , {.d=1}
                            },
                        .i=3 };



int main( void ) {
  struct MyStruct1 B[] = { {.d=12} , {.d=17} , {.d=1} };
  struct MyStruct2 b3 = { .a = B, .i = 3 };

  struct MyStruct2 b4 = { .a = (struct MyStruct1[]) {
                                {.d=12} , {.d=17} , {.d=1}
                            },
                          .i=3 };

  printf("b1->a.d=%1.2f\n", b1.a->d);
  printf("b2->a.d=%1.2f\n", b2.a->d);

  printf("b3->a.d=%1.2f\n", b3.a->d);
  printf("b4->a.d=%1.2f\n", b4.a->d);

}

暫無
暫無

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

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