一、char类型的长度为1,而字符串字面量的长度为4
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof('a'));//4
二、字符串字面量看作常量,无法修改字符串。
#include<stdio.h>
int main()
{
char *tabHeader = "Sound";
*tabHeader = 'L';
printf("%s\n", tabHeader);
return 0;
}
上面程序运行报错。为了自己好,不要去修改字符串常量值,不然你是在给自己找麻烦。
三、字符串初始化
1.初始化char数组
char header[]="Media Player";
字面量“Media Player的长度为12个字符”,表示这个字面量需要13个字节,我们就为数组分配了13个字节。初始化操作会把这些字符复制到数组中,以NUL结尾。
char header[] = "Media Player";
printf("%d\n", sizeof(header));//输出13
也可以使用strcpy函数初始化数组
char header[13];
strcpy(header, "Media Player");
下面的赋值是不合法的,我们不能把字符串字面量的地址赋给数组名字。
char header[13];
header = "Media Player";//表达式必须是可修改的左值
2.初始化char指针
最常用的方法是使用malloc和strcpy函数分配内存并将字面量复制到字符串中:
char *header = (char *)malloc(strlen("Media Player" + 1));
strcpy(header, "Media Player");
在决定malloc函数要用到的字符串长度时,要注意以下事项。
一定要记得算上终结符NUL;
不要用sizeof操作符,而是用strlen函数来确定已有字符串的长度,strlen不会算上‘\0’;
sizeof操作符会返回数组和指针的长度,而不是字符串的长度。
我们可以将字符串字面量的地址直接赋值给字符指针,不过这样就不会产生字符串的副本:
char *header="Media Player”;
试图用字符字面量来初始化char指针不会起作用。因为字符字面量是int类型,这其实是尝试吧整数赋给字符指针。这样会造成应用程序在解引指针时终止:
char *p = 'h';//char *与int的间接级别不同,虽然这一行不报错,但是解引时会出错。不合法。
printf("%c\n", *p);//报错
给char*指针赋值,这样都是可以的:
char *s;
s="123";
char *s="123";
s="456";
3.从标准输入初始化字符串
#include<stdio.h>
int main()
{
char a[10];
char *b = (char *)malloc(sizeof(char) * 10);
printf("Enter a array:\n");
scanf("%s", a);//输入字符后,会自动加上\0,所以只能输9个字符。
printf("%s", a);
printf("Enter b array:\n");
scanf("%s", b);
printf("%s\n", b);
return 0;
}
从标准输入读入字符串时可能犯得错误:
char *command;
printf("Enter a Command:\n");
scanf("%s", command);//没有分配内存
4.字符串位置小结
我们可能将字符串分配在几个地方,下面解释了几种可能的变化,下图说明了这些字符串在内存中的布局
char *globalHeader = "Chapter";
char globalArrayHeader[] = "Chapter";
void displayHeader()
{
static char * staticHeader = "Chapter";
char *localHeader = "Chapter";
static char staticArrayHeader[] = "Chapter";
char localArrayHeader[] = "Chapter";
char *heapHeader = (char *)malloc(strlen("Chapter" + 1));
strcpy(heapHeader, "Chapter");
}