数组长度 字符串长度 | 写strcat时的另外发现

#include <stdio.h>
#include <string.h>
#include <assert.h>
  
char *strcat_kll(char *strDest, const char *strSrc)  
{  
    char *address = strDest;
	assert(strDest != NULL && strSrc != NULL); 

#if 1//以下两种效果一样,任选其一
    while(* ++strDest);
#else
    while(*strDest)
		strDest++;
#endif
    while(*strDest++ = *strSrc++);

    return address;  
}  
  
void main()  
{  
    char str1[]= "string1";  
    char str2[]= "string2";  
    char *pstr1= str1;//"s.....1";//直接给指针赋字符串,在连接时报错  
    char *pstr2= str2;//"s.....2";//直接给指针赋字符串,在连接时报错

#if 0
    char *cat = strcat_kll(str1, str2);

    printf("strlen(str1)=%d\n", strlen(str1));//14
    printf("%s sizeof(cat)=%d\n", cat, sizeof(cat));//4
    printf("%s sizeof(*cat)=%d\n", cat, sizeof(*cat));//1	
    printf("%s sizeof(cat)/sizeof(*cat)=%d\n", cat, sizeof(cat)/sizeof(*cat));//4	
    printf("strlen(cat)=%d\n", strlen(cat));//14
#else
    char *pcat = strcat_kll(pstr1, pstr2);//结果str1[]= "string1string2" str2[]不变

    printf("strlen(str1)=%d\n", strlen(str1));//14
    printf("str1 len=%d\n", sizeof(str1));//8
    printf("str1 len=%d\n", sizeof(*str1));//1
    printf("str1 len=%d\n", sizeof(str1)/sizeof(*str1));//8

    printf("strlen(pstr1)=%d\n", strlen(pstr1));//14  
    printf("strlen(pstr2)=%d\n", strlen(pstr2));//7  


    printf("%s sizeof(pcat)=%d\n", pcat, sizeof(pcat));//4
    printf("%s sizeof(*pcat)=%d\n", pcat, sizeof(*pcat));//1	
    printf("%s sizeof(pcat)/sizeof(*pcat)=%d\n", pcat, sizeof(pcat)/sizeof(*pcat));//4	
    printf("strlen(pcat)=%d\n", strlen(pcat));//14
#endif	
}


 关于以上对数组长度的计算异常,如下情形属同一道理:

(1)sizeof
     方法:sizeof(数组名)/ sizeof(数组类型名) 
     说明:数组占用字节除以数组类型所占字节,结果为数组元素个数
(2)strlen
     说明:strlen,求字符串有效长度
     方法:strlen(字符数组名)  //结果为字符数组有效字符长度,不包括末尾的' /0'

注意:
当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用sizeof和strlen;
所以,在传址时,应提供2个参数:1个是数组名,代表数组首地址;1个是数组元素个数,以便确定传递的次数。
例如:
#include<stdio.h>

void Sum(int array[ ])
{
    printf("sizeof(array)=%d\n", sizeof(array));
}
void main()
{
    int a[ ]={1,2,3,4,5,6,7,8,9,10};
    printf("sizeof(a)=%d\n", sizeof(a));
    Sum(a);
}
运算结果为:
sizeof(a)=40
sizeof(array)=4
分析:
当数组作为函数参数传递时,数组名代表的是数组的首址,即指针,而非数组内容。如果传递整个数组,会导致栈溢出的。
所以在主函数中使用sizeof计算出的是准确的数组长度。而在调用函数中,由于传递的数组不再是数组本身,而是其地址,所以用sizeof计算出的,实际上是数组地址的长度,这时的sizeof(array),实际上是sizeof(int)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值