关于strlen和sizeof

跪求C语言大神
这是今天碰到的一个题,是的数组a并没有初始化,初始化我也就不来问了(那答案就很明显了)。请看下面两张图的区别。别跟我提未初始化的栈内存是垃圾什么的。
我提两个问题:
1.为什么这里int a = 36影响了结果?
2.解释一下为什么一个是1和10,一个是9和10?

sizeof这个没问题,你也说了,不讨论
看strlen这个是测试b的长度,他是从b地址开始后面遇到\0结束,0往上均有可能,超出10也有可能
这个要看b地址后面多少遇到\0字符串结束符,其实就是内存中的垃圾数据而已,呵呵

我给你个解释,你看看如何
定义ab后,那么程序运行会为data数据段分配内存空间,有正向的,也有反向的(看编辑器和系统)。那么ab会紧挨着申请内存
如果不初始化b的话,b只申请一个首地址,二不分配10个内存空间,那么a会紧挨着b的首地址
那么b后面的数据就是a的数据,所以当给a赋值的话,那么b就是有一个字节的数据(是36,char和int内存模型一样)
所以给a赋值,那么strlen(b)=1
不给a赋值,那么就是b的最长的9追问

这么说就有点明白了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-11
strlen() 测定字符串长度,它 以 字符串结束符'\0' 为 字符串结束标志,长度数 不计入 结束符。
由于变量b 没有初始化,系统每次装入exe程序时,b内的初始信息并非每次都一样,何况你还修改了程序,改变了exe程序,所以运行结果这次1下次9是有可能的。至于为何1,为何9,那就同编译器编译方法,系统装入exe的方法,偏移量大小等,都有关系。

sizeof 是测定变量存放单元 占 内存 多少字节数,你声明了 char b[10]; 所以 大小 是
10 * sizeof(char) 得 10 字节。追问

strlen(b)在去掉前面的int a = 36之前是1,去掉之后是9,这个俩数是固定的 。我分别测试了 ,多次运行和不修改程序重新编译也不会改变。这怎么解释呢,是不是跟Linux系统有关系?

第2个回答  2013-09-10

strlen:是求字符串有多少个字符。

sizeof:是求变量总共有多少个字符空间,也就是系统给这个变量分配了多大的空间。

比如:

char  a[100] = "123456789";

对于字符串a,系统给他分配了100个字节的空间。但是我们并没有将这100个字节都使用到,我们就使用到了前9个字节(当然,后面还有一个字符串结束标识符)。

所以strlen(a)的结果是9.

而sizeof(a)的结果却是100.

这就是他们结果为什么不一样的原因。

在你这个程序中,为什么strlen的2次结果不一样了??

我们前面也说了,strlen:是求字符串有多少个字符。

在你的程序中,你的字符串没有初始化,所以,你所占用的内存里面的数据还是最后一次被使用时的数据。(是什么数据谁也不知道)

所以,strlen得到的结果就是不确定的值,也因此每一个值都是有可能的。

追问

你说的“最后一次被使用时的数据”是不变的吗? 为什么我多次运行和不修改程序重新编译strlen(b)的值分别1和9也不会改变呢

第3个回答  2013-09-10
这是因为字符数组没有初始化
给数组b分配完内存后,内存里的值是不却定的,所以strlen(b)的结果是随机的
每次执行程序,分配给b的内存是不确定的,内存里的值也不确定
第4个回答  2013-09-11

分别看下面两组图的区别。

追问

额,我有点看不明白。你在win下面运行的len值是15的话,那这个值在去掉int a和不去掉的时候分别是固定的么? 我多次运行和不修改程序重新编译分别1和9这俩值是不变的

追答

局部普变量没有初始化的变量值是不确定的。每次运行都是同一个值那是因为每次运行都是按同一个方法去初始化内存。那是编译器已经确定好的,如果你要问编译器怎么去分配,我建议你看一gcc的源码。我没看过。我也不知道。。

第5个回答  2013-09-10
我可以说局部变量没初始化是垃圾值吗
嗯?不能?那我没有什么可以说的了
慢慢找“大神”吧,呵呵
相似回答