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

为什么C语言中定义的const常量会在程序执行过程中发生变更?

问题根因分析
  • 你遇到的是典型的栈缓冲区溢出问题,直接原因是输入操作非法写入了栈内存,覆盖了原本存储随机数的变量空间:
  • 代码中char *caracter;仅声明了一个字符指针变量,没有为它分配任何可用于存储字符串的有效内存空间。
  • 调用scanf("%s",&caracter)时,你直接把输入的字符串写入了存储caracter指针变量本身的栈内存区域,而非caracter指向的内存。
  • 栈上变量是相邻存储的,int const numero变量和caracter指针变量在栈上位置相邻。前三个输入的字符串较短,写入的内容还未覆盖到numero的内存空间,所以输出符合预期。当输入的字符串长度超过指针变量本身的存储空间(32位系统下指针占4字节,64位下占8字节)时,溢出的字节就会覆盖相邻的numero变量的值,导致输出的数值发生变更、长度不符合预期,严重时还会直接触发程序崩溃。

注意:C语言中const修饰的变量仅做编译期语法限制,运行时栈内存本身是可写的,所以溢出写入可以直接修改const变量的实际存储值。

修复方案
  1. 替换未初始化的字符指针为足够长度的字符数组,预留足够的空间存储输入的字符串。
  2. 修改scanf的调用参数,直接传入数组名(数组名本身就是首地址),并且添加长度限制避免溢出。
  3. 修复后的代码示例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
    srand(1); 
    const int numero = rand() % 7000 + 1000;
    char caracter[1024]; // 替换为固定长度的字符数组

    while (scanf("%1023s", caracter) != EOF) { // 修正参数、添加长度限制,预留1字节存结束符
        printf("%i\n", numero);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:02