Rob*_*obz 9 c arrays macros pointers
我试图将其表达为谷歌,但未能找到任何有用的描述它.这是代码:
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
};
Run Code Online (Sandbox Code Playgroud)
有人可以解释在没有数组或指针的情况下拥有括号的含义吗?
这称为指定初始化程序.这是一个C99功能.在定义大多数为零的数组时,它很有用,在特定索引处有一些值.
GCC页面上的示例:
int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)
相当于
int a[6] = { 0, 0, 15, 0, 29, 0 };
Run Code Online (Sandbox Code Playgroud)
"指定初始化程序"也指以类似方式初始化结构的能力:
struct point p = { .y = yvalue, .x = xvalue };
Run Code Online (Sandbox Code Playgroud)
这种模糊的语法称为指定的初始化程序,它允许您在创建数组聚合时跳过元素.
看看这个程序:
#include <stdio.h>
int a[] = {
1, [2]=3, [5]=7
};
int main() {
int i;
for(i=0;i!=sizeof(a)/sizeof(int);i++)
printf("a[%d] = %d\n", i, a[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它使用相同的语法跳过数组的元素1,3和4 a.
这是该程序打印的内容:
a[0] = 1
a[1] = 0
a[2] = 3
a[3] = 0
a[4] = 0
a[5] = 7
Run Code Online (Sandbox Code Playgroud)
您的程序执行相同的操作,但它初始化结构数组,并使用编译时常量的位移计算索引到其数组聚合中.您可以在注释(0x08,0x10,0x18,0x20和0x28)中找到这些索引的值.
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |