首先我们对以下字符串拷贝做一个分析:
char *st="how are you";
1). char a[11];strcpy(a,st);//这个strcpy时st+'\0'为12个字符,拷贝到a会段错误
2). char a[11];strcpy(++a,st);//a是一个首元素地址,++有赋值操作,不能对a使用
3). char a[11],*p;strcpy(p=a+1,&st[4])//strcpy(p, &st[4]);//strcpy 的第一个参数应该是一个字符数组或足够大的内存块的指针,而不仅仅是某个位置(如 p 所指向的)。虽然在这个特定情况下 p 指向了 a 数组的有效部分,但直接使用 &st[4] 作为 strcpy 的源地址是不标准的,因为 strcpy 期望一个以空字符 \0 结尾的字符串的地址,而 &st[4] 只是一个字符的地址,虽然能拷贝成功,但不建议这么使用
4). char a[ ],*p;strcpy(p=&a[1],st+2);//char a[ ]初识化不标准错误
在分析以上四种拷贝方式时,我们会引入char *arr="hello";与char arr[ ]="hello";
分析:char arr[ ]="hello";中"hello"在栈区。
char *arr="hello";中"hello" 是字符串字面量,存储在静态区的只读区域,以字符数组形式存在,而arr字符串数组是在栈区或全局/静态区中分配的。
在初始化过程中,arr变量定义时,编译器会生成代码将字符串字面量"hello"的内容复制到arr指向的内存位置(只复制内容),arr相当于一个副本,一个只读,一个可写。