使用字符串数组扫描打印字符串时出现段错误,求解决
问题分析与解决方案
你的代码触发段错误的核心原因是: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
相关产品推荐
相关产品推荐

