如何主动触发段错误?现有测试代码陷入无限循环求解决
问题原因与解决方案
你的代码陷入无限循环的核心原因是:你只是在递增指针并打印地址,但从未对指针指向的内存执行读写操作。段错误(Segmentation Fault)只有在程序尝试访问不属于自己的内存区域时才会触发,单纯移动指针并不会触发错误。
修正后的代码
要触发段错误,必须在打印地址后尝试访问该地址的内存内容,比如读取或写入:
#include <stdio.h> #include <stdlib.h> int main(){ char *ptr = malloc(1); // 检查malloc是否成功(测试场景大概率成功,但养成编码好习惯) if (ptr == NULL) { perror("malloc failed"); return 1; } while(1){ printf("Address is %p\n", ptr); // 尝试写入内存,触发访问错误 *ptr = 0; ptr++; } return 0; }
关键说明
- 内存访问操作:
*ptr = 0是触发段错误的关键——当指针越界到操作系统禁止访问的内存区域时,这个写入操作会触发内存保护机制,抛出段错误。 - 打印顺序:先打印地址,再执行内存访问,这样就能保证触发错误前的最后一个地址被打印出来。
- 系统差异:不同操作系统的内存布局不同,指针需要递增到哪一区域才会触发错误没有固定值,取决于系统的内存管理策略。
- 安全提醒:这类代码属于不安全操作,仅用于理解内存访问边界的测试场景,不要在生产代码中使用。
内容的提问来源于stack exchange,提问作者Norman Smith
相关产品推荐
相关产品推荐

