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

C语言动态数组问题:输入超15字符程序异常原因咨询

问题原因分析及解决方案

核心问题:栈溢出与非法字符串访问

你的代码存在两个关键问题,直接导致输入超过15字符时出现异常:

1. 变量长度数组(VLA)的栈空间限制

你在for循环内每次声明char z[1+i];,这是C99标准引入的变量长度数组,它的内存分配在程序的**栈(Stack)**区域。栈的总空间通常很小(Windows默认约1MB,Linux默认约8MB),且每个函数的局部栈帧可用空间有限。

当输入第15个字符时,i=14,数组z的大小为15,你将字符存入z[14]——此时数组刚好填满,而栈中该数组后续的内存恰好是'\0',所以printf("%s")能正常输出。但输入第16个字符时,i=15,数组大小为16,你写入z[15]时已经超出了当前VLA的栈空间范围,覆盖了栈上的其他关键数据(比如循环变量i的存储位置、栈帧的返回地址),这就是典型的栈溢出,直接导致后续printf读取到乱码。

2. 未终止的字符串与未初始化内存

每次循环创建的z数组是未初始化的,内部是栈上的随机垃圾数据。C语言规定字符串必须以'\0'结尾,否则printf("%s")会从数组起始位置一直读取,直到遇到'\0'为止。输入15字符时刚好碰运气,数组后的栈内存是'\0';输入16字符时栈溢出破坏了附近内存,导致printf读取到非'\0'的垃圾值,从而输出乱码。

修复方案

方案1:使用固定大小数组(适合可预估最大输入长度的场景)

#include <stdio.h>

#define MAX_INPUT 100  // 根据需求设置最大输入长度

int main() {
    char z[MAX_INPUT];
    int i = 0;
    char x;

    while ((x = getchar()) != '\n' && i < MAX_INPUT - 1) {
        z[i] = x;
        z[i+1] = '\0';  // 每次添加字符后立即终止字符串
        printf("%s, %p = %c, i = %d\n", z, &z[i], z[i], i);
        i++;
    }
    z[i] = '\0';  // 确保最终字符串合法
    printf("%s\n", z);

    return 0;
}

方案2:动态分配堆内存(适合无法预估输入长度的场景)

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

int main() {
    int capacity = 16;
    char *z = malloc(capacity);
    if (!z) {
        perror("malloc failed");
        return 1;
    }

    int i = 0;
    char x;
    while ((x = getchar()) != '\n') {
        // 内存不足时扩容
        if (i >= capacity - 1) {
            capacity *= 2;
            char *temp = realloc(z, capacity);
            if (!temp) {
                perror("realloc failed");
                free(z);
                return 1;
            }
            z = temp;
        }
        z[i] = x;
        z[i+1] = '\0';
        printf("%s, %p = %c, i = %d\n", z, &z[i], z[i], i);
        i++;
    }

    printf("%s\n", z);
    free(z);  // 手动释放堆内存

    return 0;
}

关键知识点总结

  • 栈与堆的区别:栈是自动分配释放的内存,空间小,适合存储临时局部变量;堆是手动管理的内存,空间大,适合动态大小的数据存储。
  • C字符串规则:必须以'\0'结尾,否则所有字符串操作函数都会触发未定义行为。
  • 变量长度数组(VLA)的局限性:VLA依赖栈空间,循环中反复创建易引发栈溢出,且无法动态扩容,不适合存储动态输入数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:28:14