user-0 提问: int *p;  *p=5;编译怎么不报错，也能运行。打印*p为5

回复:
user: user-1
content: 引用 14 楼 injuer的回复:[quote=引用 13 楼 kira_invoke 的回复:] [quote=引用 12 楼 injuer的回复:]int *p ==>声明一个此类型的指针 *p = 5 ==>让此指针以某类型获取空间并复制某空间的信息 println("%d",*p) ==>获取指针指向的空间并输出 ----------------------------------------------------------------------------------------------- 以上结论在任何计算机上都不会崩溃，原因的话请翻阅电子工程IEEE标准. 你去查查pointers on c 指针那部分[/quote]   请注意看字，说的是任何计算机，不实说任何操作系统.[/quote] 我认为这取决于编译器，与计算机和操作系统关系都不大。 *p = 5;在c语言来说并不能给*p分配内存，而只是单纯的把5赋给*p的地址，如果*p原先分配了地址就没问题，如果没有，就出错。题主并没有在赋值之前给*p分配地址，只是声明了指针，给指针p留了一个大小为指针大小的地址。这是c语言的标准，所以按理说是会出错的。但没出错并不是操作系统和计算机硬件的问题，而是因为编译器稍作改动使得出现了有别c标准的语句并能编译成功。 个人愚见，还望多多交流

user: user-2
content: 引用 13 楼 kira_invoke 的回复:[quote=引用 12 楼 injuer的回复:]int *p ==>声明一个此类型的指针 *p = 5 ==>让此指针以某类型获取空间并复制某空间的信息 println("%d",*p) ==>获取指针指向的空间并输出 ----------------------------------------------------------------------------------------------- 以上结论在任何计算机上都不会崩溃，原因的话请翻阅电子工程IEEE标准. 你去查查pointers on c 指针那部分[/quote]   请注意看字，说的是任何计算机，不实说任何操作系统.

user: user-3
content: 目测 你用的是VC++6.0    这个软件  对这个错误  不会报错    我试过的      如果你用的是 TC 的话  绝对会报错          这只是编译器的问题罢了     你知道这样写是错误的就行了

user: user-4
content: A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.  On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.

user: user-5
content: 你换一个不那么宽容的编译器试一试。

user: user-6
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 jiqiang01234 的回复:] int*p=NULL: *p=5 崩溃 在纯DOS下不崩溃。[/quote] 保护模式下也行,当然是有前提的。

user: user-1
content: 引用 12 楼 injuer的回复:int *p ==>声明一个此类型的指针 *p = 5 ==>让此指针以某类型获取空间并复制某空间的信息 println("%d",*p) ==>获取指针指向的空间并输出 ----------------------------------------------------------------------------------------------- 以上结论在任何计算机上都不会崩溃，原因的话请翻阅电子工程IEEE标准. 你去查查pointers on c 指针那部分

user: user-7
content: int*p=NULL: *p=5 崩溃

user: user-8
content: 正确就是有可能崩溃，而不是 100% 崩溃。

user: user-2
content: int *p ==>声明一个此类型的指针 *p = 5 ==>让此指针以某类型获取空间并复制某空间的信息 println("%d",*p) ==>获取指针指向的空间并输出 ----------------------------------------------------------------------------------------------- 以上结论在任何计算机上都不会崩溃，原因的话请翻阅电子工程IEEE标准.

user: user-9
content: 引用 10 楼 jiqiang01234 的回复:int*p=NULL: *p=5 崩溃 在纯DOS下不崩溃。

user: user-10
content: 笔试题答案是错的。  解引用野指针是C++标准规定的不定义行为，编译器干什么都可以，包括不崩溃。

user: user-11
content: 也许，有的编译器会给个警告

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。不同的编译器还不一样，有个挂了，有个没挂

user: user-12
content: 引用 3 楼 qq_31880427 的回复:引用 楼主 qq_31880427 的回复:我换了个编译器，崩溃呢   这种操作是看运气的，你的p是一个野指针，指向不确定，运气好的话没事，运气不好写到其他什么重要数据就崩溃了 这种错误不是靠编译器来保证的，是需要程序员自己确保的

user: user-0
content: 引用 楼主 qq_31880427 的回复:我换了个编译器，崩溃呢

user: user-9
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-0
content: 引用 1 楼 user-13 的回复:不是所有错误的程序都会崩溃。我看了个笔试题，说应该崩溃的啊，怎么还能运行，也不报错

user: user-13
content: 不是所有错误的程序都会崩溃。