Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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_Null_Compiler Construction_Literals_Null Pointer - Fatal编程技术网

编译器如何处理C中的非零空指针值?

编译器如何处理C中的非零空指针值?,c,null,compiler-construction,literals,null-pointer,C,Null,Compiler Construction,Literals,Null Pointer,答案正确地解释了空指针。在空指针下的最后一段中,它说 如果底层体系结构有一个定义为地址0xDEADBEEF的空指针值,那么就由编译器来解决这个问题 现在,如果某些体系结构内部将空指针值定义为非零。这些if语句如何有效。编译器如何处理它们 if (!pointer) if (pointer == NULL) if (pointer == 0) 毕竟,当一个空指针常量被分配给一个指针时,您会得到一个空指针,并且空指针常量总是0或(void*)0。进一步的回答是 因此0是一个空指针常量。如果我们将其

答案正确地解释了空指针。在空指针下的最后一段中,它说

如果底层体系结构有一个定义为地址0xDEADBEEF的空指针值,那么就由编译器来解决这个问题

现在,如果某些体系结构内部将空指针值定义为非零。这些if语句如何有效。编译器如何处理它们

if (!pointer)
if (pointer == NULL)
if (pointer == 0)
毕竟,当一个空指针常量被分配给一个指针时,您会得到一个空指针,并且空指针常量总是
0
(void*)0
。进一步的回答是

因此
0
是一个空指针常量。如果我们将其转换为指针类型,我们将得到一个空指针,对于某些体系结构,它可能不是所有位零

我真的无法理解当初始化为指针时,这个文本
0
如何变成非所有位零。这不是一个简单的初始化吗?此外,如果我的空指针值不是零,那么上面的3个if语句如何检查空指针?我们不是在比较非零空指针值和
0
literal吗

如果(!指针)

如果C实现将值DEADBEEF16用于空指针,编译器将编译
If(!pointer)
为如下代码:

    compare             pointer, #0xDEADBEEF
    branch-if-not-equal else-clause
if(指针==0)

整型常量零符合“空指针常量”(C 2018 6.3.2.3)。将指针与空指针常量进行比较时,空指针常量将转换为指针的类型(6.5.9.5)。编译器将通过为结果指针生成死区F16来实现此转换。然后它会将
指针
与死区F16进行比较,并相应地进行分支

简单地说,仅仅因为字符“0”出现在源代码中并不意味着编译器必须在它生成的指令中使用零。它生成完成工作所需的任何指令和值

我真的无法理解当初始化为指针时,这个文本
0
如何变成非所有位零

字符“0”并没有强迫编译器给它一个零的值。“0”的代码在ASCII中为48,在EBCDIC中为240,因此编译器在处理此字符或其他字符时不会以零值开始。通常,在处理数字时,它必须读取数字并进行一些运算来计算数字所代表的数字。正是这个软件使“0”代表值0,或使“23”代表值23。要使“0”表示空指针,编译器中的软件只需在上下文中使用“0”替换指针的任何位置替换空指针的内部值

例如,在
void*x=0,编译器最初可能会将“0”转换为零,但这将是数据结构的一部分,该数据结构还表示这是当前值为零的标记或整型常量表达式。当编译器看到此整型常量表达式用于初始化指针时,它将更改该值,并生成代码,将指针初始化为空指针的内部值

如果(!指针)

如果C实现将值DEADBEEF16用于空指针,编译器将编译
If(!pointer)
为如下代码:

    compare             pointer, #0xDEADBEEF
    branch-if-not-equal else-clause
if(指针==0)

整型常量零符合“空指针常量”(C 2018 6.3.2.3)。将指针与空指针常量进行比较时,空指针常量将转换为指针的类型(6.5.9.5)。编译器将通过为结果指针生成死区F16来实现此转换。然后它会将
指针
与死区F16进行比较,并相应地进行分支

简单地说,仅仅因为字符“0”出现在源代码中并不意味着编译器必须在它生成的指令中使用零。它生成完成工作所需的任何指令和值

我真的无法理解当初始化为指针时,这个文本
0
如何变成非所有位零

字符“0”并没有强迫编译器给它一个零的值。“0”的代码在ASCII中为48,在EBCDIC中为240,因此编译器在处理此字符或其他字符时不会以零值开始。通常,在处理数字时,它必须读取数字并进行一些运算来计算数字所代表的数字。正是这个软件使“0”代表值0,或使“23”代表值23。要使“0”表示空指针,编译器中的软件只需在上下文中使用“0”替换指针的任何位置替换空指针的内部值


例如,在
void*x=0,编译器最初可能会将“0”转换为零,但这将是数据结构的一部分,该数据结构还表示这是当前值为零的标记或整型常量表达式。当编译器看到此整型常量表达式用于初始化指针时,它将更改该值,并生成代码,将指针初始化为空指针的内部值。

可能重复:但读取正确。可能重复:但读取正确。我对您的答案有两个疑问。第一:您的意思是说,在这个特定上下文中,文本
0
实际上并不表示值0。它将在内部转换为
0xDEADBEEF
。正确的?第二:为什么要用word
character
表示0?在这种情况下,这不是整数常量吗?为什么我们要谈论它的ASCII值?@LocalHost