那如何解释下面运行结果(输出的就像有结束符似的,没乱码)?
这有可能的,s是被分配在栈空间,s数组后面是个不定的值,碰巧是个0而已。但是这种正常并不是绝对的,你把这段代码放在这里是正常的,放在别处就不一定输出正常,所以不必纠结这种现象。char只是一种数据类型,'a','b','c'看起来是字符,其实也是一个个数值,这种定义和 int c[]={1,2,3} ; 相比,除了类型不同,含义是一样的,并非是字串,编译器不会自动去补结束符,只有字串才有结束符
追问你把你的“异常”的运行截图发来瞧瞧?
追答我没有运行过,没有图。 即使我这里出现的异常现象和别人PC上出现的也不一定相同,s数组后面值不是个确定的值,是上一次被使用过后留下的值。你可以定义一个指针查看一下这个值是多少
char *p ;
int i ;
p = (char*)s ;
for( i = 0 ; i < 10 ; i ++ ,p++ )
printf( "%d " , (int)*p ) ;
另外,有时候也不要被眼睛迷惑了,字符中还有很多是不可见字符,你看到的abc不一定就是abc,可能后面还有一堆不可见字符,只是看不到而已。
就算看不到,由于我两边加了等号,绝不可能是没有长度的字符。如果说没有长度,那从实践的意义上我就认为可忽略。就像很多人说有鬼神的存在,尽管说没法从理论上证明不存在,但实践上可以认为是不存在。
追答你说的是,输出到屏幕上的确实是这样的。不过先用我那段代码把字符输出来看看是什么,不排除后面就是个0.
追问你写的那段不管从初始化形式上还是输出格式上和我的问题都没关系。不认为是个好例子。
追答查看内存只是一种常用的debug方法。好吧,你这么认为就随你吧。
两个问题:
2. 直接赋值{"a"}与{'a'}的区别?
刚学习c语言变量的时候有讲,定义一个变量,系统会自动给他分配一块存储空间,里面的内容是不确定的。可能是用过被释放的空间但是没清除内容。 所以一般在使用前先赋值。
char str[]={};是错误语句,通常应该连编译都不会过。--- gcc可以编译运行的,呵呵
追答我想你肯定能看懂“不过”后面的表述!
追问因为你一直在讲理论,猜测,所以我就没详细看了。
追答你说错了,计算机语言本身理论就不多,只是人为一些规定;当然为什么这么规定而不那么规定当然是有考究的,这些考究的基本原则就是规定域里要能自圆其说,不能前后矛盾。所以对于计算机语言,高手们也讲不出多少“理论”来,何况我们?所以我讲的全是实践,碰到过什么就说什么,没碰到的不敢乱说。即使GCC能通过char str[]={};,我想也输出不了str中是什么确定的东西……
追问你的思维方式没什么问题,但我主要不是为了让别人启发我思考而是想就这个具体问题得到实践上的答案。
运行结果如下:
追问麻烦解释下这个运行结果
我用gcc编译的,输出字符串%s结果为空啊,你这用的是VS编译器吗
追问dev cpp啊。你要原封不动地抄我的printf语句。
追答#include <stdio.h>你再试试我完整版的:
int main(int argc, char *argv[])
{
char s[]={};
printf("s=%s=\n",s);
printf("done\n");
getchar();
return 0;
}
运行结果:
神奇了,你这个编译器感觉是最稳定的。
追答对啊,我这是gcc 4.9.2版本的,是比较新版的。
追问我的和你的一样啊。
我的是GNU GCC 4.9.2,32位的。
能不能给出一段代码证明它确实不一样?
追答c语言规定:数组在定义的时候必须指明数组的长度 例:char str[100];
初始化的时候如果没有指明长度,根据初始数据的个数决定数组长度。
char str[]=""; 数组的长度是1,数组中存放的是\0
char str[]={}; 数组的长度是0,数组中什么也没有
在下面的程序中,数组存放的数据就是有限的。
main()
{ char s1[]="";
char s2[]={};
printf("%s",s1) ; //该语句输出为空,因为\0不会显示
printf("%s",s2); //输出一行乱码 因为数组中没有值
}
你运行过吗?我用gcc测试了你的代码,两个都没有任何输出。
追答再回到你前面都说的推荐的写法char str[100]="";这长度有什么用?我们都知道C语言是不检查下标的。你能不能举个例子说明不用足够的下标长度声明就出错的情况?
追答#include "stdio.h"
int main()
{ char s[10]="aaaaaaaaaggggg"; //字符串的长度超过数组的长度,系统会报错
printf("%s\n",s);
}
对于数组,我们在赋值的时候必须保证赋值的个数要小于数组的长度,否则会出现下标越界的情况。
但我题目问的是后面字符串为空字符串或者空括号啊。