编译器如何区分数字0 字符0 字符串结束符 \0

数字0: 0

字符0 : ‘0’

字符串结束符:’\0′

有以下程序,分析程序输出什么?

#include <stdio.h>#include <stdlib.h>#include <string.h>/* #pragma pack(1) */voidfset( char * p ){memset( p, '0', sizeof( p ) );}intmain( void ){char buf[ 8 ];strcpy( buf, "1234567" );fset( buf );buf[ 7 ] = 0;printf( "%s", buf );return 0;}首先分析子函数fset,它里面只有一个memset语句,将p指针开始的sizeof( p )个字节内存复制字符‘0’ ,,注意不是数字0 !!

主程序将buf数组塞满了字符串“1234567”刚好7个数据,预留一个字节的结束符空间。

最后buf[ 7 ] = 0;注意是数字 0 不是字符 ‘0’ !!!

和我们预想的一样。

或者程序改成这样也可以:

#include <stdio.h>#include <stdlib.h>#include <string.h>/* #pragma pack(1) */voidfset( char * p ){memset( p, '0', sizeof( p ) );}intmain( void ){char buf[ 8 ];strcpy( buf, "1234567" );fset( buf );buf[ 7 ] = '\0';printf( "%s", buf );return 0;}或者这样子也可以的:

#include <stdio.h>#include <stdlib.h>#include <string.h>/* #pragma pack(1) */voidfset( char * p ){memset( p, '0', sizeof( p ) );}intmain( void ){char buf[ 8 ];strcpy( buf, "1234567" );fset( buf );/* buf[ 7 ] = '\0'; */printf( "%s", buf );return 0;}这个就是系统默认给这个数组加上了一个字符串结束符了。编译器真好。。。。。接下来的就比较触目惊心了。。。。。。集中注意力。。。。。。。。。。华丽的。。。。分割线。。。。。

将程序稍微修改一下:

#include <stdio.h>#include <stdlib.h>#include <string.h>/* #pragma pack(1) */voidfset( char * p ){memset( p, 0, sizeof( p ) );}intmain( void ){char buf[ 8 ];strcpy( buf, "1234567" );fset( buf );buf[ 7 ] = 0;printf( "%s", buf );return 0;}把memset里面的 字符‘0’ 改为数字 0,程序运行结果:没有任何输出 !!因为数组的前 4 个元素都为 数字0,也就是字符串的结束符,所以你懂的。

再修改一下程序:

#include <stdio.h>#include <stdlib.h>#include <string.h>/* #pragma pack(1) */voidfset( char * p ){memset( p, '0', sizeof( p ) );}intmain( void ){char buf[ 8 ];strcpy( buf, "1234567" );fset( buf );buf[ 7 ] = '0';printf( "%s", buf );return 0;}把buf[ 7 ] = 0;改成 buf[ 7 ] = ‘0’;也就是将原本要放置结束符的位置放了一个字符’0’,又因为整个字符串数组只有8字节大小的空间,所以字符串结束符没办法存在了(被排挤到外面了,系统无法为之分配该数组里的空间)。悲剧啊。。。。

程序运行输出:

” src=”http://img.blog.csdn.net/20150324190556391″ >

至于为什么这样子自己研究吧 !

现在终于知道这几个**东西的区别了吧 !!!!

但是至少可以为自己的荷包省钱可以支些招,这点还是很现实的。

编译器如何区分数字0 字符0 字符串结束符 \0

相关文章:

你感兴趣的文章:

标签云: