数字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″ >
至于为什么这样子自己研究吧 !
现在终于知道这几个**东西的区别了吧 !!!!
但是至少可以为自己的荷包省钱可以支些招,这点还是很现实的。