聊点基础的–sizeof,strlen,数组,字符串在一起能整哪些坑?
- 2019 年 11 月 24 日
- 筆記
来源:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
对于初学者来说,sizeof,strlen,数组,字符串整在一起是痛苦的,它总能在某些莫名其妙的时候整一个措手不及。本文看看它们在一起能挖什么坑。
例子
在说明这些问题之前,先看一段代码,看看你是否都理解了。(注:以下代码结果为编译为64位程序后运行结果)
//来源:公众号【编程珠玑】 #include <stdio.h> #include <string.h> void testArr(const char str[]) { printf("%lu %lun", sizeof(str), strlen(str)); } int main(void) { /*test 0*/ char str[] = "hello"; printf("test0 %lu %lunn", sizeof(str), strlen(str)); //6 5 /*test 1*/ char str1[8] = "hello"; printf("test1 %lu %lunn", sizeof(str1), strlen(str1)); //8 5 /**test 2*/ char str2[] = {'h','e','l','l','o'}; printf("test2 %lu %lunn", sizeof(str2), strlen(str2)); //5 10 /**test 3*/ char *str3 = "hello"; printf("test3 %lu %lunn", sizeof(str3), strlen(str3)); //8 5 /*test 4*/ char str4[] = "hello"; testArr(str4);//8 5 /*test 5*/ char str5[] = "hell o"; printf("test5 %lu %lun", sizeof(str5), strlen(str5)); //7 4 /*test 6*/ char str6[10] = {0}; printf("test6 %lu %lunn", sizeof(str6), strlen(str6)); //10 0 /*test 7*/ char str7[5] = "hello"; printf("test7 %lu %lunn", sizeof(str7), strlen(str7)); //5 10 /*test 8*/ char str8[5] = {0}; strncpy(str8,"hello",5); printf("%sn",str8);//hellohello return 0; }
特别注意观察test2和test7。 在解释这些测试之前,先复习一下sizeof,strlen以及数组的内容。
sizeof
首先需要明确的是,sizeof是操作符,即它并不是函数,它的作用对象是数据类型,因此,它作用于变量时,也是对其类型进行操作。得到的结果是该数据类型占用空间大小,即size_t类型。 例如:
struct test { int a; char b; }; sizeof(int);//得到4 sizeof(test);//4字节对齐时,得到8
需要注意的是,它在计算数据类型占用空间大小时,会考虑字节对齐,关于字节对齐,可以参考《理一理字节对齐的那些事》。 另外sizeof的时间复杂度是O(1)。
strlen
strlen是函数
size_t strlen(const char *s);
它用于计算字符串的长度。它的计算原则是: 从参数s所指向的内存开始往后计数,直到内存中的内容是0(即’ ’,参考《NULL,0,'