字符数组的长度问题
- C/C++ code
char test1[3] = {'a', 'b', 'c'}; char test2[] = {"abc"}; printf("sizeof(test1)=%d\n", sizeof(test1)); // 3 printf("strlen(test1)=%d\n", strlen(test1)); // 7?怎么得来的,依编译器不同而变化? printf("sizeof(test2)=%d\n", sizeof(test2)); // 4 printf("strlen(test2)=%d\n", strlen(test2)); // 3 // char test1[4] = {'a', 'b', 'c', '\0'}; // printf("sizeof(test1)=%d\n", sizeof(test1)); // 4 // printf("strlen(test1)=%d\n", strlen(test1)); // 3,正常。
Windows下的C-free。
[解决办法]
char test1[3] = {'a', 'b', 'c'};
char test2[] = {"abc"};
printf("sizeof(test1)=%d\n", sizeof(test1)); // 3 这个就获得数组大小,3个元素,都是1个字节
printf("strlen(test1)=%d\n", strlen(test1)); // 7 strlen根据\0判断结尾,这个值取决当前字符C后面多远有\0,根据系统内存情况随机。
printf("sizeof(test2)=%d\n", sizeof(test2)); // 4 正确,数组有四个元素 a b c \0
printf("strlen(test2)=%d\n", strlen(test2)); // 3 数组长度3 ,不包含\0
[解决办法]
char test1[3] = {'a', 'b', 'c'};对test1计算长度,因为没有以'\0'结尾,所以计算的长度是不确定的,因为找不到'\0'就不知道在哪儿结束了。而你的test2是字符串"abc",系统会自动给它加上'\0',所以计算的长度是3(strlen)。
[解决办法]
printf("sizeof(test1)=%d\n", sizeof(test1)); // 3
char test1[3] = {'a', 'b', 'c'};一共三个元素
printf("strlen(test1)=%d\n", strlen(test1)); // 7
strlen必须碰到\0才结束,你test1[]后面存的是test2[]而test2[]是字符串类型,所以强制会给你的test2[]后面加一个\0;比如你这样声明就会有问题test2[3]="abc"因为你没有给\0留下位置
printf("sizeof(test2)=%d\n", sizeof(test2)); // 4
上面的懂了这个应该也懂了吧
printf("strlen(test2)=%d\n", strlen(test2)); // 3
strlen判断的时候\0会被丢掉不计算在字符串的长度内