现在的位置: 首页 > 综合 > 正文

对于字符数组末尾的/0

2013年08月01日 ⁄ 综合 ⁄ 共 1419字 ⁄ 字号 评论关闭

实验了一下...因为对很多东西都不熟悉,所以只有自己实验了..

#define array_size 10

#include <stdio.h>
int main()
{
        char string[array_size]={"HelloWorl"};
        printf("String:%s/n",string);
        return 0;
}

这样就不会错,但是数组越界的东西会出错,也就是说,假如定义了数组长度为10,那么其实里边只能定义9个字符,因为要用/0来表示字符结尾...

如果这样的话...
#define array_size 10

#include <stdio.h>
int main()
{
        char string[array_size]={"HelloWorld"};
        printf("String:%s/n",string);
        return 0;
}

那么这样就会出错,因为占满了10个字符位,那么终止符就没地方了...出错...

在接受用户输入的时候...
假如用gets(),在编译的时候,会有gcc来提示该函数比较危险,不建议使用...
假如用for循环来一个个字符的输入...又觉得心里不太舒服..
char str[10]={“hello“};
用scanf(“%s”,&str);
在这里假如在scanf的时候,虽然取出了str的首地址..但是
假如用户的输入超过了9个字符,那么就会覆盖该数组后面的内存...
就会出错...
注意scanf会自动的在用户输入的字符串后边添加/0,

#include <stdio.h>
int main()
{
        int i;
        char str[10];

        printf("please input:/n");
        scanf("%s",&str);

        printf("1.printf:%s/n",str);
        for(i=0;i<=9;i++)
                printf("str[%d]:%c/n",i,str[i]);
        return 0;
}

看看执行结果,如果没有其他程序来访问该数组后面的内存的话,那么还是没有问题的...
编译的时候有warning...但是...依然生成了可执行程序...
[ktktkt@Jintao c]$ ./5
please input:
helloworld
1.printf:helloworld
str[0]:h
str[1]:e
str[2]:l
str[3]:l
str[4]:o
str[5]:w
str[6]:o
str[7]:r
str[8]:l
str[9]:d

可以看到用printf的时候,会自动输出,直到找到/0,才停止输出...
而用for循环的时候,也是一直输出...

那么再试一次...
[ktktkt@Jintao c]$ ./5
please input:
helloworldhelloworld
1.printf:helloworldhelloworld
str[0]:h
str[1]:e
str[2]:l
str[3]:l
str[4]:o
str[5]:w
str[6]:o
str[7]:r
str[8]:l
str[9]:d
str[10]:h

发现printf的确是...一直输出直到发现/0,而不管是否会overflow...
而for循环则到此为止....
那么应该是/0覆盖了数组后面的8位...

抱歉!评论已关闭.