数组长度 字符串长度 | 写strcat时的另外发现
来源:互联网 发布:nba2k球星数据 编辑:程序博客网 时间:2024/05/18 03:52
#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个是数组元素个数,以便确定传递的次数。
当数组作为函数参数传递时,数组名代表的是数组的首址,而非数组内容,故无法使用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(array)=4
分析:
当数组作为函数参数传递时,数组名代表的是数组的首址,即指针,而非数组内容。如果传递整个数组,会导致栈溢出的。
所以在主函数中使用sizeof计算出的是准确的数组长度。而在调用函数中,由于传递的数组不再是数组本身,而是其地址,所以用sizeof计算出的,实际上是数组地址的长度,这时的sizeof(array),实际上是sizeof(int)。
- 数组长度 字符串长度 | 写strcat时的另外发现
- 数组、字符串长度的计算
- 取数组、字符串长度
- C# 中数组和字符串的长度
- 不同长度的字符串数组排序
- 怎样获取字符串数组的长度
- 求字符串的长度(用数组做形参)
- 用数组求字符串的长度
- 字符串,数组,集合表示长度的区别
- 求一个字符串数组的实际长度
- 输出一个字符串数组的实际长度
- Java数组和字符串的长度计算
- 发现关于数组求其长度 strlen 和 sizeof的问题
- 数组的length属性可读可写,字符串的长度length属性不可以修改
- 发现数据库字符串长度被截取
- 利用数组求字符串长度
- 没有长度的数组
- 字符数组的长度
- VS2005下wxWidgets-2.8.x环境的搭建
- windows无法完成格式化
- Tomcat内存溢出分析及解决方法
- UK测试工具列表
- openvpn v2.1.3添加用户名密码形式
- 数组长度 字符串长度 | 写strcat时的另外发现
- dom4j解析xml字符串实例
- 国外免费电子书资源下载
- 《灵飞经》3·印神无双 第十二章 孤岛无双
- hdu 4536
- The Linux Socket Filter: Sniffing Bytes over the Network
- Boost 1.48.0编译
- 《灵飞经》3·印神无双 第十三章 剑奕星斗 1
- [Win8]Windows8开发笔记(八):数据绑定的基础