no code you say j8 ! 超详细!!!
今天的话题是老生常谈的sizeof()和strlen(),这俩憨憨玩意其实很简单,刷题的时候经常会遇到,在此做一些总结,
sizeof()
sizeof()求的是占据内存的大小(此处我们假设在32位系统上)
strlen()
strlen()求的是实际长度
说多了也没啥用,直接上代码看区别,冲就完事了!!!
case 1:
#include <stdio.h>
int main()
{
char str[] = "hello"; //或者可以写成 char str[] = {"hello"};
char *p = "hello";
printf("%d\n%d\n", sizeof(str), sizeof(p));
/*
输出6,4;
前者求的是数组所占空间的大小,在这种定义方式下,系统会在字符串的末尾自动加上'\0',结果为6;
后者实际上求的是p这个指针的大小,在32位系统上,对其求sizeof()结果是4;
*/
}
case 2:
#include <stdio.h>
int main()
{
char str1[] = "hello";
char str2[] = {'h','e','l','l','o'};
printf("%d\n%d\n", sizeof(str1), sizeof(str2));
/*
输出6,5;
前者同上;
后者在这种定义方式下系统是不会自动在字符串末尾添加结束符'\0'
*/
}
case 3:
#include <stdio.h>
int Getsize(int data[])
{
return sizeof(data);
}
int main()
{
int data1[] = {1,2,3,4,5};
int size1 = sizeof(data1);
int *data2 = data1;
int size2 = sizeof(data2);
int size3 = Getsize(data1);
printf("%d\n%d\n%d\n", size1, size2, size3);
/*
输出20,4,4
1.data1是个数组,sizeof(data1)求的是数组大小,该数组包含5个整数,每个整数占4个字节,
因此共20个字节;
2.data2声明为指针,尽管他指向了数组data1的第一个数字,但他的本质任然是一个指针,
在32位系统上对任意指针求sizeof结果均为4;
3.在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针
因此size3的结果任然为4;
*/
}
case 4:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello";
printf("%d\n%d\n", sizeof(str), strlen(str));
/*
输出6,5;
sizeof()不再赘述;
strlen(str),返回str的长度,但不记'\0'在内
*/
}
case 5:
#include <stdio.h>
int main()
{
char str[10] = "hello"; //注:sizeof(str) == 10, strlen(str) == 5;
char str[10] = "0123456789"; //错错错!!!
/*
出错原因:
在明确字符串大小时,需要给字符串预留1个空位来存放'\0',所以在定义长度为10的字符串
时,最多只能初始化9个位置,最后一个用来存放'\0';
*/
}
常见问题总结如上,如有错误,还望指正!