为何C语言中printf语句会导致数组元素看似被删除?
问题分析与解答
首先你的代码存在严重的类型错误,这直接触发了C语言中的未定义行为:
senha[numberPosition] = "";
senha[numberPosition]是单个char类型的变量,而""是字符串字面量,本质是指向只读内存的const char*指针。你把指针值赋值给单个字符,会覆盖该位置的字符为指针的低8位随机值,这种操作的运行结果完全不可控,会依赖栈布局、编译器优化等环境因素。
关于有无printf("%i\n", numberPosition);导致不同输出的原因:
- 保留该printf语句时,它会改变栈帧布局或寄存器状态,使得赋值给
senha[8]的指针低8位恰好是'\0'(字符串结束符)。输出时字符串到第8位就截断,看起来像是删除了'l',结果为01000heo。 - 删除该printf语句后,栈布局发生变化,赋值给
senha[8]的指针低8位变成了非结束符的其他值,原位置的'l'虽被覆盖,但不影响后续字符输出,结果就变成01000helo。
正确写法示例
如果想把目标位置设为字符串结束符,应该写:
senha[numberPosition] = '\0';
如果想真正删除该位置的字符(将后续字符前移),需要手动移动数组元素:
for (int i = numberPosition; senha[i] != '\0'; i++) { senha[i] = senha[i+1]; }
内容的提问来源于stack exchange,提问作者dumb163
相关产品推荐
相关产品推荐

