J'ai essayé d'articuler cela dans Google, mais je n'ai rien trouvé d'utile. Voici le code:
struct Segdesc gdt[] =
{
// 0x0 - unused (always faults -- for trapping NULL far pointers)
SEG_NULL,
// 0x8 - kernel code segment
[GD_KT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 0),
// 0x10 - kernel data segment
[GD_KD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 0),
// 0x18 - user code segment
[GD_UT >> 3] = SEG(STA_X | STA_R, 0x0, 0xffffffff, 3),
// 0x20 - user data segment
[GD_UD >> 3] = SEG(STA_W, 0x0, 0xffffffff, 3),
// 0x28 - tss, initialized in trap_init_percpu()
[GD_TSS0 >> 3] = SEG_NULL
};
4 Réponses :
en C L'opérateur [] et * peut traduire dans la même chose lors de la définition. Mais, lors de l'allocation de l'espace, ils ont une syntaxe différente. p>
Par exemple: A [1] et * (A + 1) sont identiques lorsqu'ils traitent avec une gamme de caractères. p>
Ok, mais cela ne répond en aucun cas à la question.
Après avoir regardé les autres réponses, pensez-vous toujours que cela "en aucun cas répond à la question"?
Cette syntaxe obscuce est appelée initialisée désignée et vous permet de sauter des éléments lors de la création d'un agrégat de tableau.
Regardez ce programme: P>
a[0] = 1 a[1] = 0 a[2] = 3 a[3] = 0 a[4] = 0 a[5] = 7
Les initialisateurs désignés sont l'une des nouvelles fonctionnalités les plus utiles de C99.
Ceci s'appelle un initialisateur désigné . C'est une fonctionnalité C99. Il est utile lorsque la définition des tableaux qui sont principalement nuls, avec certaines valeurs à des indices spécifiques.
Exemples de berceau hors de la page GCC: P>
struct point p = { .y = yvalue, .x = xvalue };
Je pense que cette syntaxe a été introduite en C99, bien que dans une brève enquête sur Google, je ne trouve rien de définitif. En tout état de cause, dans les dialectes C plus anciens, si vous souhaitez initialiser explicitement, par exemple, le 3ème élément d'un tableau, vous devez énumérer explicitement les zéros pour les éléments précédents. C.-à-d., dans moderne C, vous pouvez saisir cela à la place: p> la syntaxe est une sorte d'obscure, mais l'intuition, je Pensez, c'est que ce que vous faites est à peu près l'équivalent horaire compilé de: p> très grossièrement, à nouveau, le code exemple est équivalent à p> struct Segdesc gdt[(GD_TSS0 >> 3) + 1];
gdt[0] = SEG_NULL;
gdt[GD_KT >> 3] = ...;
...
gdt[GD_TSS0 >> 3 ] = ...;