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

为何无法打印字符串指针数组?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:10:26