C语言小问题-不可小看
以下四段小程序,您可以试一试写出程序运行的结果,看能对几道题.,硬件条件:X86 32CPU
/*
//No.1
#include<stdio.h>
#include<string.h>
void main(void)
{
int i =0;
char cb[20] ;
for( i=0; i<20; i++ )
{
cb[i] = 0;
}
printf("%d,%d/n", strlen(cb), sizeof(cb));
return;
}
//No.2
void main(void)
{
int i =0;
char cb[20] ;
for( i=0; i<20; i++ )
{
cb[i] = '0';
}
printf("%d,%d/n", strlen(cb), sizeof(cb));
return;
}
//No.3
void main(void)
{
int i =0;
char cb[20] = {0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
for( i=0; i<10; i++ )
{
cb[i] = '0';
}
printf("%d,%d/n", strlen(cb), sizeof(cb));
return;
}
//No.4
void main(void)
{
int i =0;
char cb[20] = {0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0};
for( i=0; i<20; i++ )
{
cb[i] = '0';
}
printf("%d,%d/n", strlen(cb), sizeof(cb));
return;
}
题目的结果如下:
No.1:0,20
No.2:不确定,20
No.3:10,20
No.4:21,20
特别是第四个,主要是变量i先压栈,然后数组cb才压栈,经过20次给数组元素赋值后,i其实只有一个字节非零(0x14),其他三个字节都是零,因此strlen(cb)=20+1(i的非零字节)=21