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

