Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法理解此c语法是什么_C_Variable Declaration - Fatal编程技术网

无法理解此c语法是什么

无法理解此c语法是什么,c,variable-declaration,C,Variable Declaration,我讨厌问这样的语法问题,但我一直无法通过搜索找到答案。我不确定这些变量声明的含义。我对第三个的最佳猜测是,它采用标签检查点地址的逻辑and和页面大小的倒数,将其转换为无符号长,然后将其重新转换为空指针。代码如下所示: 谢谢 前两个是分别与printf和exit兼容的函数指针。例如,你可以做: my_exit = exit; my_exit(3); 这相当于调用exit(3) 你对第三个的猜测是正确的。这取决于页面大小始终是2的幂这一事实。因此,pagesize-1将具有一个二进制模式,即低阶位

我讨厌问这样的语法问题,但我一直无法通过搜索找到答案。我不确定这些变量声明的含义。我对第三个的最佳猜测是,它采用标签检查点地址的逻辑and和页面大小的倒数,将其转换为无符号长,然后将其重新转换为空指针。代码如下所示:


谢谢

前两个是分别与
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);