[英]Initialize constant pointer to array in same struct
typedef struct {
char a[100];
char const *secondHalfOfA;
}
//Can i set { secondHalfOfA = a[49]; } somehow?
你當然可以。
typedef struct {
char a[100];
char const *const secondHalfOfA;
} toto;
#define TOTO_INITIALIZER(NAME) { .secondHalfOfA = &((NAME).a[49]) }
static toto A = TOTO_INITIALIZER(A);
始終如一地使用這樣的初始化器具有額外的優點,那就是它也用全0
初始化了數組。
這適用於具有指定初始化程序的C99。 如果您只有歷史C,則可以執行以下操作
#define TOTO_INITIALIZER(NAME) { { 0 }, &((NAME).a[49]) }
編輯:看到您對另一個答案的評論,我想您輸入錯誤的類型就是const
。 但是在這種情況下,真正的C初始化也非常有效。
您不能自動初始化指向對象中間的指針。
但是,您可以假裝有重疊的對象。 雖然不是很漂亮:-)
#include <stdio.h>
#include <string.h>
struct twoparts {
union {
char a[20];
struct {
char dummy[10];
char b[10];
} s;
} u;
};
int main(void) {
struct twoparts x;
strcpy(x.u.a, "1234567890123456789");
printf("second part: %s\n", x.u.s.b);
return 0;
}
不,您不能在typedef
做到這一點。 請記住:使用typedef
關鍵字定義的是數據類型,而不是變量。
在C ++中,您可以在默認構造函數中執行此操作。 但是在C語言中,沒有辦法做到這一點。
Pablo說過 ,您不能使用初始化程序來做到這一點。 初始化后,您可以很容易地做到這一點,但是每次都必須這樣做:
// Definition (once)
typedef struct {
char a[100];
char const *secondHalfOfA;
} TYPENAME;
// Use (each time)
TYPENAME t;
t.secondHalfOfA = &t.a[49];
// Or
TYPENAME *pt;
pt = malloc(sizeof(*pt));
pt->secondHalfOfA = &pt->a[49];
出於這樣的原因,我們擁有面向對象的語言(例如C ++(以及Java和...)及其關聯的構造函數) ,以便我們可以可靠地創建具有自定義初始化的結構。
示范程序:
#include <stdio.h>
// Definition (once)
typedef struct {
char a[100];
char const *secondHalfOfA;
} TYPENAME;
int main(int argc, char* argv[])
{
// Use of the type (need to initialize it each time)
TYPENAME t;
t.secondHalfOfA = &t.a[49];
// Example actual use of the array
t.a[49] = 'A';
printf("%c\n", *t.secondHalfOfA); // Prints A
// Uncommenting the below causes a compiler error:
// "error: assignment of read-only location ‘*t.secondHalfOfA’"
// (That's gcc's wording; your compiler will say something similar)
//*t.secondHalfOfA = 'B';
//printf("%c\n", *t.secondHalfOfA);
return 0;
}
使用gcc編譯和輸出:
$ gcc -Wall temp.c $ ./a.out A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.