1.sizeof()和strlen()的区别:
sizeof():以字节为单位返回其整个长度的大小(总),在编译阶段便开始起作用适用于绝大多数类型;
strlen():测试字符型数组的长度,其他类型不可以,遇见 ‘\0’ 终止(实际),即求已存在的长度;
/*===============================================
* 文件名称:1.c
* 创 建 者:
* 创建日期:2022年04月08日
* 描 述:
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
char s1[10] = "abcd!";
char *s2 = "\n123\\";
// 指针 占八个字节
char *s3 = "\n";
// 指针
char s4[10] = "\n123\\";
// \n 一个字符,转行
// \\ 一个字符,反斜杠+转义字符
printf("strlen(s1)=%d,sizeof(s2)%d\n",strlen(s1),sizeof(s2));
printf("sizeof(s1)=%d\n",sizeof(s1)); //若,初始化不对,及其容易造成野指针
printf("sizeof(s3)=%d\n",sizeof(s3));
printf("strlen(s4)=%d\n",strlen(s4));
return 0;
}
野指针:指针未初始化或全部初始化。
root@ubuntu:/C# ./a.out
strlen(s1)=5,sizeof(s2)8
sizeof(s1)=10
sizeof(s3)=8
strlen(s4)=5
2.存储溢出
char p = 255; //有符号字符存储长度 -128~127
注意:不要错认为是先将等号右边算完(包含自增自减),再赋值给左边。实际上也是将等号右边算完,在赋值给等号左边,但是自增自减例外
自增自减:先拿来使用,再加1或者减1
这里也要考虑优先级,具体需要读者自己体会!!!
/*===============================================
* 文件名称:111.c
* 创 建 者:
* 创建日期:2022年04月08日
* 描 述:
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=1,b=0;
char c,d;
c = 255;
// 字符占一个字节,即八个二进制位(加一个符号位)
// c溢出,但是既然存储了,只能将符号位拿来使用
// 但是机器不一样,既然符号位是1,就认为该数是负数,自动取反加一
b = a++;
printf("c:%d\n",c++);
//因此这里输出 -1
d = c++ + 1;
printf("d:%d\n",d);
printf("b:%d\n",b);
return 0;
}
root@ubuntu:/C# ./a.out
c:-1
d:1
b:1
3.