为何使用两个char*变量时C程序异常,单个变量却可正常运行?
未初始化指针导致的C程序异常分析
先看你提供的两段代码:
第一段(无法正常运行):
#include <stdio.h> int main() { char *a,*b; scanf("%s %s",a,b); printf("%s %s",a,b); return 0; }
第二段(看似正常运行):
#include <stdio.h> int main(){ char *a; scanf("%s",a); printf("%s",a); return 0; }
你的推测完全正确,核心问题就是未初始化的指针指向非法内存:
char *a, *b;只声明了指针变量,但没有给它们分配合法的内存地址,此时指针是「野指针」,指向内存中随机的、未授权的区域。- 第一段代码里,
scanf要往两个野指针指向的区域写入数据,极大概率会触发内存访问冲突(比如覆盖系统或其他程序的内存),直接导致程序崩溃。 - 第二段代码看似能运行,纯粹是运气问题:刚好野指针指向的内存区域暂时没有被系统保护或占用,
scanf写入的数据没有立刻引发冲突。但这属于未定义行为,程序随时可能崩溃、输出乱码,甚至破坏其他数据,绝对不能认为是「正常工作」。
当你用malloc分配内存后,指针指向了堆上一块合法的、属于当前程序的内存区域,scanf写入数据时就有了合法的存储空间,程序自然能正常运行。
另外,还有两种更简单的合法写法:
- 用数组声明:
char a[100], b[100];(栈上分配固定大小的内存,注意要保证数组大小足够容纳输入的字符串) - 用
scanf限制长度:scanf("%99s", a);避免输入过长导致缓冲区溢出
内容的提问来源于stack exchange,提问作者user21226736
相关产品推荐
相关产品推荐

