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

使用char *类型指针打印字符串时报段错误的原因是什么?

段错误核心原因
  • 你声明的char *p、char *s属于未初始化的野指针,C语言不会自动为字符指针分配存储字符串的内存空间,两个指针仅保存了随机的内存地址,没有指向任何进程有权限读写的合法内存块,直接通过scanf向对应地址写入输入属于未定义行为。
  • 打印p时程序未崩溃是未定义行为的巧合:p的随机地址刚好落在进程可访问的内存区间内,而s的随机地址指向了进程无读写权限的内存区域,写入或读取该地址时触发了系统的内存保护机制,抛出段错误。
正确实现方案

方案1:使用栈上字符数组存储(无需手动释放内存)

提前声明固定长度的字符数组,直接在栈空间分配存储字符串的内存,建议限制输入长度避免缓冲区溢出:

// 数组长度按实际需求设置,预留1位存储字符串结束符'\0'
char p[1024], s[1024];
// %1023s限制最多读取1023个字符,避免输入过长溢出
scanf("%1023s", p);
scanf("%1023s", s);
printf("%s\n%s\n", p, s);

方案2:手动分配堆内存(支持动态调整长度)

通过malloc主动申请堆内存,使用完成后需要调用free释放,避免内存泄漏:

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

int main() {
    char *p = malloc(1024);
    char *s = malloc(1024);
    // 内存分配失败时判空处理
    if (p == NULL || s == NULL) {
        perror("内存分配失败");
        return 1;
    }
    scanf("%1023s", p);
    scanf("%1023s", s);
    printf("%s\n%s\n", p, s);
    // 释放申请的堆内存
    free(p);
    free(s);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:39:01