sizeof運算符需要注意的問題

 sizeof運算符用于取得“東西”的大小,以字節為單位。比如sizeof(char)就返回1,表明char數據類型占一個字節。又如:

char  str[]  =   " 12345 " ;
printf(
" %d " sizeof (str)); // 等于6

字符串str占六個字節,這樣做是可行的。如果strlen(str)一把,則等于5,因為strlen返回的是字符串的字符數,不包含結尾的/0。可是用sizeof丈量字符串大小時的確需要注意了,比如下面的代碼就有問題。

void  func( const   char   const   *  pstr)
{
    printf(
"%d "sizeof(pstr));
    
return;
}


void  main( void )
{
    
char str[] = "12345";
    func(str);
    
return;
}

紅色處打印出來的是多少?

實話告訴你吧,是4,不是6。

結論是不能用sizeof計算通過傳引用調用過來的字符串的大小!

至于為什么,很遺憾我也沒有深挖,反正就是不行。在上述代碼處sizeof把pstr當作一個指針計算出來了,因為是32位的系統,所以任何指針都占4個字節。

如果在函數中打算計算參數所致的字符串所占的空間大小還是老老實實的(strlen(str) + 1) * sizeof(char)或者(strlen(str) + 1) * sizeof(TCHAR)吧。

如果不是字符串,則可以放心使用,比如一個結構,看看下面代碼:

typedef  struct  Date {
    
int Day;
    
int Month;
    
int Year;
}
;
    
void  fun(struct Date  *  Input)
{
    printf(
"%d "sizeof(*Input));
    
return;
}


int  main( void )
{
    Date s1;
    fun(
&s1);
    
    
return 0;
}

返回結果是12,沒什么問題,不過就是用的時候要加上*別忘了。可以看出字符串是比較特殊的。strlen在任何情況下大家都可以放心使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值