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

指针数组存储字符串异常:读取行后printf无输出问题排查

问题分析与修复

核心问题1:局部变量生命周期失效

你在readlines函数里定义的line[MAXLENGTH]是栈上的局部数组,每次for循环迭代结束后,该数组占用的栈内存会被系统回收。你把line的地址赋值给lines[i],相当于让指针指向了已经失效的内存空间——这就是“野指针”,后续访问时行为完全不可预测,自然打印不出内容。

核心问题2:字符串未添加终止符

代码读取字符到line后,没有手动添加字符串结束符'\0'。printf("%s")需要依赖这个终止符判断字符串结尾,缺少它会导致读取越界,引发未定义行为。

修复后的代码方案

用malloc在堆上分配内存,内存生命周期会持续到手动调用free为止,避免局部变量失效问题。同时添加字符串终止符,处理输入结束的情况:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINES 4
#define MAXLENGTH 1000

char *lines[MAXLINES];

void readlines() {
    int i;
    for (i = 0; i < MAXLINES; i++) {
        char c;
        int j = 0;
        // 为每行分配堆内存
        char *line = malloc(MAXLENGTH * sizeof(char));
        if (!line) { // 检查内存分配是否成功
            fprintf(stderr, "内存分配失败\n");
            exit(1);
        }
 
        // 读取字符,同时处理输入结束的情况(EOF)
        while (j < MAXLENGTH - 1) { // 留一个位置给'\0'
            c = getchar();
            if (c == EOF || c == '\n' || c == '\0') {
                break;
            }
            line[j++] = c;
        }
        line[j] = '\0'; // 添加字符串终止符
        
        // 如果遇到EOF,提前终止循环并清空剩余指针
        if (c == EOF) {
            while (i < MAXLINES) {
                lines[i++] = NULL;
            }
            break;
        }

        lines[i] = line;
    }
}

int main(void) {
    readlines();
    if (lines[0]) { // 先检查指针是否有效
        printf("%s\n", lines[0]);
    }
    
    // 释放堆内存,避免内存泄漏
    for (int i = 0; i < MAXLINES && lines[i]; i++) {
        free(lines[i]);
    }

    return 0;
}

额外说明

  • 你之前用strcpy出错,大概率是没给目标指针分配内存就直接复制——strcpy需要目标内存有足够空间,不能用未初始化的空指针。
  • 内存分配后必须检查是否成功,避免内存不足导致程序崩溃。
  • 程序结束前要释放malloc分配的内存,防止内存泄漏。

内容的提问来源于stack exchange,提问作者ayman benyahia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:45:28