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); }
原因解析
数组空间不足导致越界写入
char nameString[] = "";定义的数组大小仅为1,只能存储字符串结束符\0,没有多余空间容纳输入的姓名字符。使用scanf("%s", nameString)输入内容时,输入的字符会越界写入数组之外的栈内存区域,这属于C语言中的未定义行为——此时字符串的存储状态已经非法,后续任何操作都可能引发不可预测的结果。指针移动触发未定义行为的表现
循环中把namePointer向后移动20次,会让指针指向栈上远离nameString的内存位置。由于之前的越界写入已经破坏了栈内存的布局,指针移动的操作可能意外覆盖了字符串末尾的字符或结束符\0,最终表现为字符串末尾字符丢失。
而常量字符串存储在程序的只读数据段,内存布局稳定,即使指针越界移动也不会修改到它的内容,因此不会出现问题。
修复方案
- 给数组分配足够的空间,确保能容纳输入内容和结束符:
char nameString[50] = ""; // 定义大小为50的数组 - 使用带长度限制的输入函数,避免越界:
scanf("%49s", nameString); // 限制输入长度为49,留1位存\0
内容的提问来源于stack exchange,提问作者Mehdi Zeynalov
相关产品推荐
相关产品推荐

