精通各个软件卸载! 2021-01-09 19:25 采纳率: 50%
浏览 8
已采纳

C语言 新手程序出现错误

void main()
{
	int x[]={85,75,27,40,65,98,74,89,12,5,46,97,13,69,52,26,19,92};
	int *p;
	int i=0,j=0;
	for(i=0;x[i]!=0;i++)
	{
		j+=1;
		printf("%d\t",x[i]);
	 } 
	printf("\n");
	printf("%d",j);
}
  

不知道为什么记数结果是21,,搞不明白

  • 写回答

7条回答 默认 最新

  • include_iostream_ 2021-01-09 19:51
    关注

    补充一点:从做法上看,你好像认为数组之外自然会以0结尾,这种想法完全不正确。事实上,在经典的C语言进程内存区组织结构中,数组之后紧跟的应当是其他栈内容。栈上的内容一般与函数调用的保存现场、跳转逻辑和局部变量有关,这个特性使得栈溢出攻击成为可能。如果数组后紧随的是跳转逻辑用到的地址,就能发动控制流劫持(control flow hijacking)。如果数组后紧随的是局部变量,就可能被利用来窃取敏感数据。因此,试图利用局部数组上越界的部分,实际上是极度危险的操作,任何现代公司都几乎不可能允许技术人员这样做。

    顺便一提,一个常见的误解是“未分配的空间上值默认为0”,这个想法也是完全错误的。未分配的空间上可以是任何值。对于malloc获取的空间,也不会有初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作