无法理解此c语法是什么
我讨厌问这样的语法问题,但我一直无法通过搜索找到答案。我不确定这些变量声明的含义。我对第三个的最佳猜测是,它采用标签检查点地址的逻辑and和页面大小的倒数,将其转换为无符号长,然后将其重新转换为空指针。代码如下所示:无法理解此c语法是什么,c,variable-declaration,C,Variable Declaration,我讨厌问这样的语法问题,但我一直无法通过搜索找到答案。我不确定这些变量声明的含义。我对第三个的最佳猜测是,它采用标签检查点地址的逻辑and和页面大小的倒数,将其转换为无符号长,然后将其重新转换为空指针。代码如下所示: 谢谢 前两个是分别与printf和exit兼容的函数指针。例如,你可以做: my_exit = exit; my_exit(3); 这相当于调用exit(3) 你对第三个的猜测是正确的。这取决于页面大小始终是2的幂这一事实。因此,pagesize-1将具有一个二进制模式,即低阶位
谢谢 前两个是分别与
printf
和exit
兼容的函数指针。例如,你可以做:
my_exit = exit;
my_exit(3);
这相当于调用exit(3)
你对第三个的猜测是正确的。这取决于页面大小始终是2的幂这一事实。因此,pagesize-1
将具有一个二进制模式,即低阶位中的所有1,高阶位中的所有0。反转它会反转那些位。这可以用作位掩码,带有一个地址,用于返回地址指向的页面开头的地址。然后,它将页面
设置为包含检查点的页面的开头
int(*my_printf)(const char*格式,…)
声明一个函数指针,该指针返回一个int,并将一个c样式的字符串作为第一个参数,在format参数之后有一个可变数量的参数
void(*my_exit)(int)代码>声明一个函数指针,该指针不返回任何内容,但接受int
void*page=(void*)((无符号长)(&&checkpoint)&~(getpagesize()-1))
声明一个通用指针,该指针相当于指向检查点的指针的地址,该指针被页面大小减1掩盖。my_printf
是返回int的函数的指针,它使用char指针参数和其他变量列表
my_exit
是指向函数的指针,该函数没有返回值,只接受一个int参数
页面
是指向某些未指定类型的指针。它被分配了一个不应该编译的表达式的值,因为&&
是一个二进制运算符,没有左操作数,地址的一元地址没有意义。&~(getpagesize()-1)
位屏蔽了可能是地址的低阶位,然后它将指向页面的开头
一元&&
是一个GNU C扩展,它接受一个(goto)标签的地址,因此这个构造基本上获得了包含该标签的代码页开始的地址。这是非常特定于编译器和操作系统的东西,并不是C语言的一部分。前两个是函数指针是的,这正是它所做的。不知道你为什么要问这个。您所做的只是用文字说明表达式的内容。请注意,“标签地址”(&&checkpoint
,此处)是GNU C扩展,可能无法在其他编译器中使用。非常感谢。为什么他们要把页面变成一个空页,而不是把它作为一个未签名的长页?另外,为什么位掩码可以返回页面的开头?例如,页面大小为8,检查点地址为00100000。pagesize-1的倒数是1111000。这将是00100000英镑。为什么这一定是包含检查点的页面的开始?例如,它不能也从0001111开始,并且在包含检查点时仍然保持页面大小为8吗?
my_exit = exit;
my_exit(3);