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

使用scanf接收字符串后用printf输出出现Segmentation Fault问题求助

解决printf输出字符串时出现Segmentation Fault的问题

我来帮你揪出这个段错误的根源,你的代码里有两个关键问题直接导致了崩溃:

  • 指针数组没有指向有效内存:你声明的char *a[5]是一个包含5个字符指针的数组,但这些指针初始化后都是「野指针」——指向内存里随机的、你无权访问的地址。当你用scanf往这些地址里写字符串时,相当于在非法内存区域瞎写,系统直接触发段错误终止程序。
  • scanf的参数类型不匹配:scanf("%s", &a[i])这里的&a[i]是char**类型(指针的指针),但%s格式符要求传入的是char*类型的参数。虽然有些编译器不会报错,但这种写法会导致内存访问的异常,也是崩溃的诱因之一。

下面给你两种可行的修正方案:

方案一:手动为每个指针分配内存(灵活适合动态长度)

#include <stdio.h>
#include <stdlib.h>

int main(){ 
    char *a[5]; 
    int i; 
    printf("\n enter value "); 
    for (i=0;i<5;i++){ 
        // 给每个指针分配能存储20个字符的空间(包含字符串结束符'\0')
        a[i] = malloc(20 * sizeof(char)); 
        // 一定要检查内存分配是否成功,避免空指针问题
        if (a[i] == NULL) { 
            perror("Failed to allocate memory");
            return 1;
        }
        printf("%d Name :\n",i); 
        // 直接传a[i]即可,它本身就是char*类型
        scanf("%s", a[i]); 
    } 
    printf("%s\n",a[2]); 
    printf("%s\n",a[3]); 

    // 用完内存记得释放,避免内存泄漏
    for (i=0;i<5;i++){
        free(a[i]);
    }
    return 0;
}

方案二:使用二维字符数组(简单直观,适合固定长度场景)

#include <stdio.h>

int main(){ 
    // 定义二维数组:5个字符串,每个最多存19个字符+1个结束符
    char a[5][20]; 
    int i; 
    printf("\n enter value "); 
    for (i=0;i<5;i++){ 
        printf("%d Name :\n",i); 
        // a[i]等价于&a[i][0],是合法的char*类型
        scanf("%s", a[i]); 
    } 
    printf("%s\n",a[2]); 
    printf("%s\n",a[3]); 
    return 0;
}

额外提醒:避免缓冲区溢出

不管用哪种方案,都建议限制scanf的输入长度,防止用户输入过长的字符串导致缓冲区溢出。比如上面的代码里,如果是20长度的空间,就用scanf("%19s", a[i]),这样最多读取19个字符,留一个位置给结束符,更安全。

内容的提问来源于stack exchange,提问作者tomtom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:29:26