记一道有意思的题目
程序员文章站
2024-03-12 20:05:56
...
#include <stdio.h>
#include <string.h>
int main()
{
char aa[10];
printf("%d",strlen(aa));
return 0;
}
题目的标题是: char a[10],strlen(a)为什么等于 15?
很明显这里没有初始化,所取得的值不唯一,应该是随机数,我原本也是这么想。
但是在VC下运行的结果是15,在其他编译运行的结果却是其他的数字7。
又转到在线编译器 里进行编译得出来的结果是2
但是为什么在VC里面恒为15呢?
首先根据4字节对齐,char a[10];申请了12个字节的空间。在VC6.0的调试环境下,a[10] 每个数组元素被赋值为CC,a[10]上面为EBP的值,EBP值为Ox0012FFC0,由于X86符合小端存贮,所以又多加了3个字节,故一定为15个字节。
栈中ebp的值Ox0012FFC0,实际在内存布局(INTEL CPU)是
0xc0 0xff 0x12 0x00
低---------------高
即多3个字节才遇到'\0'
char a[10];
strlen(a);
字符数组a未初始化,或赋值,对其用strlen库函数计算字符串长度,返回值是不确定的,因为strlen函数实际上就是从地址a开始计算字符格式,一直遇到'\0'为止。
另外注意的是,如果此处用sizeof() 的话值就不一样了。因为sizeof()不需要初始化,而strlen是需要初始化的,
转载于:https://blog.51cto.com/fucksystem/1308553