Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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_Windows_Pointers_Null_Zero - Fatal编程技术网

在C中初始化地址为零的变量

在C中初始化地址为零的变量,c,windows,pointers,null,zero,C,Windows,Pointers,Null,Zero,这可能是一个相当基本的问题。我知道有一个C约定将空指针的值设置为零。您是否可以在Windows中为新变量分配空间,而分配的空间的地址恰好为零?如果不是,通常是什么占据该地址区域?如果分配空间的地址为零,则可用内存不足。这意味着无法分配变量。如果分配空间的地址为零,则可用内存不足。这意味着无法分配变量。值0没有特殊意义。将指针设置为0是一种惯例,C编译器必须对其进行相应的解释。但是,与物理地址0没有连接,实际上,该地址可以是有效地址。在许多系统中,虽然较低的地址包含与硬件相关的地址,如中断向量或其

这可能是一个相当基本的问题。我知道有一个C约定将空指针的值设置为零。您是否可以在Windows中为新变量分配空间,而分配的空间的地址恰好为零?如果不是,通常是什么占据该地址区域?

如果分配空间的地址为零,则可用内存不足。这意味着无法分配变量。

如果分配空间的地址为零,则可用内存不足。这意味着无法分配变量。

值0没有特殊意义。将指针设置为0是一种惯例,C编译器必须对其进行相应的解释。但是,与物理地址0没有连接,实际上,该地址可以是有效地址。在许多系统中,虽然较低的地址包含与硬件相关的地址,如中断向量或其他。例如,在Amiga上,地址4是操作系统的入口点,这也是一个任意决定。

值0没有特殊意义。将指针设置为0是一种惯例,C编译器必须对其进行相应的解释。但是,与物理地址0没有连接,实际上,该地址可以是有效地址。在许多系统中,虽然较低的地址包含与硬件相关的地址,如中断向量或其他。例如,在Amiga上,地址4是操作系统的入口点,这也是一个任意的决定。

在MS-DOS上,空指针是一个相当有效的指针,由于运行在其中的操作系统,实际上可以用垃圾覆盖0x0地址并损坏内核。你可以这样做:

int i;
unsigned char* ptr = (unsigned char *)0x0;
for(i = 0; i < 1024; i++)
    ptr[i] = 0x0;
现代操作系统,如Linux、Windows,在其中运行,您永远无法直接访问物理内存

您的程序将使用的处理器


它还可以跟踪你访问的内容,如果你敢碰不属于你的东西,你的程序就会遇到麻烦。这肯定包括尝试取消对0x0地址的引用。

在MS-DOS上,空指针是一个相当有效的指针,由于运行在其中的操作系统,实际上可能会用垃圾覆盖0x0地址并损坏内核。你可以这样做:

int i;
unsigned char* ptr = (unsigned char *)0x0;
for(i = 0; i < 1024; i++)
    ptr[i] = 0x0;
现代操作系统,如Linux、Windows,在其中运行,您永远无法直接访问物理内存

您的程序将使用的处理器


它还可以跟踪你访问的内容,如果你敢碰不属于你的东西,你的程序就会遇到麻烦。这肯定包括尝试取消对0x0地址的引用。

当您接通电源时,0x0处的地址是CPU开始执行的位置。通常在这个地址有一个跳转到BIOS代码和IIRC的第一个64K或更多的保留由BIOS/UEFI确定的其他任务。这是一个应用程序无法访问的区域


考虑到在Windows中,地址0x0处不能有变量,这一点应该很清楚。

当CPU通电时,地址0x0处是CPU开始执行的位置。通常在这个地址有一个跳转到BIOS代码和IIRC的第一个64K或更多的保留由BIOS/UEFI确定的其他任务。这是一个应用程序无法访问的区域


如果您在Windows中将指针的值设置为零,则应该清楚,在Windows中,地址0x0处不能有变量。

int *p = 0;
正如您所相信的,它不一定会指向物理地址零。当指针被分配一个常量零值或用它初始化时,编译器需要识别这种情况并以特殊的方式处理它。编译器需要用依赖于实现的空指针值替换该零。后者不一定指向零地址

空指针值应该由一个不会用于任何其他目的的物理地址表示。如果在某些实现中,物理地址零是一个可用地址,那么这种实现将必须使用不同的物理地址来表示空指针。例如,某些实现可能为此使用地址0xFFFFFFFF。在这种实现中,初始化

int *p = 0;
将实际使用物理0xFFFFFF初始化p,而不是使用物理零


另外,您可能需要查看常见问题解答:,它主要用于解决该问题。

当您将指针的值设置为零时,如中所示

int *p = 0;
正如您所相信的,它不一定会指向物理地址零。当指针被分配一个常量零值或用它初始化时,编译器需要识别这种情况并以特殊的方式处理它。编译器需要将该零替换为依赖于实现的零 空指针值。后者不一定指向零地址

空指针值应该由一个不会用于任何其他目的的物理地址表示。如果在某些实现中,物理地址零是一个可用地址,那么这种实现将必须使用不同的物理地址来表示空指针。例如,某些实现可能为此使用地址0xFFFFFFFF。在这种实现中,初始化

int *p = 0;
将实际使用物理0xFFFFFF初始化p,而不是使用物理零


另外,您可能想看看常见问题解答:,它主要用于解决该问题。

这意味着它没有分配空间。这意味着它没有分配空间。这不完全正确。C标准将文本0定义为空指针常量。是的,但这并不一定会转换为物理0地址。假设void*p=0和void*p=reinterpret\u cast0可能会将不同的物理值放入p中,那么…@jcoder:在这种情况下,reinterpret\u cast的问题已经讨论过了。C++规范最初暗示ReReTyt*Case0也产生正确的空指针值。后来在C++11中,该保证被取消。无论如何,不能保证等价的是void*p=0;int i=0;void*p=void*i;这两个在语义上确实不同。谢谢@AndreyT,我希望在实际代码中两者都看不到,但最好知道它会做什么:这不完全是真的。C标准将文本0定义为空指针常量。是的,但这并不一定会转换为物理0地址。假设void*p=0和void*p=reinterpret\u cast0可能会将不同的物理值放入p中,那么…@jcoder:在这种情况下,reinterpret\u cast的问题已经讨论过了。C++规范最初暗示ReReTyt*Case0也产生正确的空指针值。后来在C++11中,该保证被取消。无论如何,不能保证等价的是void*p=0;int i=0;void*p=void*i;这两种语言在语义上确实不同。谢谢@AndreyT,我希望在实际代码中看到这两种语言,但很高兴知道它会做什么: