指针数组存储字符串异常:读取行后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
相关产品推荐
相关产品推荐

