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

C编程问题:遍历字符指针后字符串出现异常篡改现象

C语言字符串循环后末尾字符丢失的原因分析

问题描述

编写的C语言代码中,输入姓名后执行for循环,字符串最后一个字符会被覆盖丢失;但使用常量字符串时无此问题。控制台输出示例:输入姓名Mehdi后,循环前输出String before iteration - Mehdi,循环后输出String after iteration - Mehd。

问题代码

void update_string_new()
{
    printf("Enter your name: ");
    char nameString[] = ""; 
    scanf("%s", nameString); 

    char *namePointer = nameString;  

    printf("String before iteration - %s\n", nameString); 

    for(int i=0; i<20; i++)
    {
        namePointer++; 
    }
    
    printf("String after iteration - %s\n", nameString); 
}

原因解析

  1. 数组空间不足导致越界写入
    char nameString[] = "";定义的数组大小仅为1,只能存储字符串结束符\0,没有多余空间容纳输入的姓名字符。使用scanf("%s", nameString)输入内容时,输入的字符会越界写入数组之外的栈内存区域,这属于C语言中的未定义行为——此时字符串的存储状态已经非法,后续任何操作都可能引发不可预测的结果。

  2. 指针移动触发未定义行为的表现
    循环中把namePointer向后移动20次,会让指针指向栈上远离nameString的内存位置。由于之前的越界写入已经破坏了栈内存的布局,指针移动的操作可能意外覆盖了字符串末尾的字符或结束符\0,最终表现为字符串末尾字符丢失。

而常量字符串存储在程序的只读数据段,内存布局稳定,即使指针越界移动也不会修改到它的内容,因此不会出现问题。

修复方案

  • 给数组分配足够的空间,确保能容纳输入内容和结束符:
    char nameString[50] = ""; // 定义大小为50的数组
    
  • 使用带长度限制的输入函数,避免越界:
    scanf("%49s", nameString); // 限制输入长度为49,留1位存\0
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:04:56