为何该C程序出现段错误?改用char s[100]数组即可运行?
C语言段错误原因:字符指针与数组的本质差异
问题描述
以下C语言代码运行时出现段错误,但将第4行的char *s替换为char s[100]数组后程序可正常执行,请问原因是什么?
#include<stdio.h> int main(){ int l=0; char *s; printf("enter string : \n"); fgets(s,100,stdin); puts(s); while(s[l]!='\0'){ l++; } printf("length : %d",l-1); return 0; }
核心原因
- 用
char *s;声明的是一个字符指针变量,它只是个用来存储内存地址的容器,但初始化时没有被赋予任何有效的内存地址——指针里的初始值是随机的,可能指向系统保护内存、其他程序的内存或者当前程序未授权的区域。 - 当
fgets尝试把用户输入的字符串写到s指向的内存时,这种非法内存写入操作会直接触发操作系统的内存保护机制,抛出段错误终止程序。 - 换成
char s[100];后,程序会在栈上直接分配一块100字节的连续合法内存空间,数组名s作为指向这块内存起始地址的常量指针,fgets可以安全地将输入内容写入这块内存,程序自然能正常运行。
内容的提问来源于stack exchange,提问作者Rejeo
相关产品推荐
相关产品推荐

