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

使用字符串数组扫描打印字符串时出现段错误,求解决

问题分析与解决方案

你的代码触发段错误的核心原因是:char *str[4]是一个包含4个字符指针的数组,但这些指针没有指向任何有效的内存空间,初始值都是随机的垃圾地址。当scanf尝试往这些非法地址写入字符串时,直接触发了内存访问错误。

下面是两种可行的解决方法:

方法一:动态分配内存给每个指针

给数组里的每个字符指针分配足够的内存空间(这里因为scanf限制了最多10个字符,所以要分配至少11字节的空间,留一个位置存字符串结束符\0):

#include <stdio.h>
#include <stdlib.h> // 包含malloc和free的头文件

int main() {
    char *str[4];
    // 先给每个指针分配内存
    for(int i = 0; i < 4; i++) {
        str[i] = malloc(11 * sizeof(char));
        // 检查内存分配是否成功
        if(str[i] == NULL) {
            perror("malloc failed");
            return 1;
        }
    }

    // 读取字符串
    for(int i = 0; i < 4; i++) {
        scanf("%10s", str[i]);
    }

    // 输出字符串
    puts("");
    for(int i = 0; i < 4; i++) {
        printf("%s\t", str[i]);
    }

    // 释放分配的内存,避免内存泄漏
    for(int i = 0; i < 4; i++) {
        free(str[i]);
    }

    return 0;
}

方法二:使用二维字符数组

直接定义一个二维字符数组,这样每个字符串都有固定的内存空间,不需要手动分配内存:

#include <stdio.h>

int main() {
    // 4个字符串,每个最多存10个字符+1个结束符,所以定义为[4][11]
    char str[4][11];
    for(int i = 0; i < 4; i++) {
        scanf("%10s", str[i]);
    }
    puts("");
    for(int i = 0; i < 4; i++) {
        printf("%s\t", str[i]);
    }

    return 0;
}

两种方法的区别:

  • 动态分配内存更灵活,后续可根据需求调整内存大小;
  • 二维数组使用更简单,无需手动管理内存,适合固定长度的字符串场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:03:22