You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:32:01