字符串,是由多个字符打包而成的数据结构,但是在C语言中并不存在原生类型的字符串类型。
C语言中的字符串是利用字符指针实现的,定义样式为:
char *str=“linux”;
printf("%s\n",str1);
其在C语言中由多个字节连续分布构成,很像是数组,但是请区分字符数组与字符串。在c语言中字符串有以下特点:①指针指向字符串头。②串尾固定为\0。③空间连续分布。
\0表示NULL,ASCII编码为0,数字0的ASCII编码为48。注意区分。
由于\0是字符串的结束标志,所以字符串中不能包含有\0,因此\0也就成为了C语言中的魔数(被定义有特殊意义的符号)。
char *str="linux";其分配在代码段占有6个字节但如果加上指针本身,那么就占有10个字节(4字节指针大小+5字节符号大小+1字节\0)。
sizeof()不是函数,而是运算符,在计算字符串时会将“\0”计入,但是如果越界则会返回占用内存字节大小。
char a[]="linux";
char *b="linux";
sizeof(a);输出5
sizeof(b);输出6
strlen()是库函数,计算以字节为单位,计算字符串时不包含"\0"。
char a[5];
sizeof(a);输出5
strlen(a);输出5
char b[5]={0};
sizeof(a);输出5
strlen(a);输出0
char c[5]={2,3};
sizeof(a);输出5
strlen(a);输出2
char a[]="linux";
sizeof(a);输出6
strlen(a);输出5
char *p="linux";
sizeof(a);输出4 指针大小
strlen(a);输出5 字符串长度
strlen函数是对\0进行判定,如果数组越界情况下,可能出现错误(脏栈)。
char *p="linux"中,p指针放在栈上,而内存中(代码段)真的存在“linux”字符串,p指向"l"的首地址。
char a[]="linux",相当于a[]={"l","i","n","u","x"};内存中并没有linux这个字符串。
数组是自带内存的,字符串是指针不存在内容,其只是指针。
将字符串存放在栈上:
char a[7];
char *p=a;
字符串存放在数据段:
char a[7];全局变量
char *p=a;
字符串存放在堆上:
char *p=(char *)malloc(7);