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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:21