使用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
相关产品推荐
相关产品推荐

