为何无法打印字符串指针数组?C语言程序输入后无输出求助
问题修复方案
你的代码存在两个核心问题,导致程序出现未定义行为(无输出直接结束):
1. 指针数组未分配有效内存
char *a1[10], *a2[10]; 声明的是指针数组,每个元素都是未初始化的char*指针,指向的内存地址是随机的。直接写入这些随机地址会触发内存访问错误,导致程序异常终止或静默崩溃。
2. scanf参数错误
你代码里的scanf("%s", a1);传递的是指针数组的首地址(&a1[0]),而非单个元素的地址,完全不符合scanf接收字符串的要求,进一步加剧了内存错误。
修复后的代码(两种可选方案)
方案一:用二维字符数组(简单直接,适合固定长度字符串)
直接声明二维字符数组,每个元素自带内存空间,无需手动分配:
#include<stdio.h> int main (void){ int i; // 声明二维数组:10个字符串,每个最多存99个字符+1个结束符 char a1[10][100], a2[10][100]; for (i=0; i<10; i++){ printf("Enter text %d for a1: ", i); // 限制输入长度,避免缓冲区溢出 scanf("%99s", a1[i]); printf("Enter text %d for a2: ", i); scanf("%99s", a2[i]); } for (i=0; i<10; i++){ printf("text %d is %s for a1\n", i, a1[i]); printf("text %d is %s for a2\n", i, a2[i]); } return 0; }
方案二:用动态内存分配(适合可变长度字符串)
如果需要支持任意长度的字符串,可以用malloc手动分配内存,或者使用GNU扩展的%ms让scanf自动分配:
#include<stdio.h> #include<stdlib.h> // 需包含malloc/free的头文件 int main (void){ int i; char *a1[10], *a2[10]; for (i=0; i<10; i++){ printf("Enter text %d for a1: ", i); // %ms 让scanf自动分配内存,存储到a1[i]中 scanf("%ms", &a1[i]); printf("Enter text %d for a2: ", i); scanf("%ms", &a2[i]); } for (i=0; i<10; i++){ printf("text %d is %s for a1\n", i, a1[i]); printf("text %d is %s for a2\n", i, a2[i]); // 记得释放动态分配的内存,避免内存泄漏 free(a1[i]); free(a2[i]); } return 0; }
额外优化点
- 在
printf的提示后加上:和换行,确保提示信息能立即显示,不会因为行缓冲被延迟输出。 - 使用
%99s限制输入长度(针对方案一),避免缓冲区溢出。
内容的提问来源于stack exchange,提问作者Ba2Han
相关产品推荐
相关产品推荐

