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