strcpy函数的复制问题

实在不明白D选项哪里不对,如果写成strcpy(str3,"HELLO3")对不对呢?两个问题求解释

img

这里str3根str4都是不能直接拷贝的,因为它们都只是指针并没有属于它们真正的内存,而str1根str2都是数组,是有实际的内存的,所以允许进行改变。

涉及点比较多,这里char *类型的 str3,只声明而未初始化 ,且不知道在局部还是全局定义,所以分2种情况:1.局部的未初化 2.全局的未初始化
一.如果是声明为局部,运行后大概率会报错“使用了未初始化的局部变量”
这是有以下原则——对于未初始化的局部变量,它的值是不确定的,究竟指向哪块内存也是未知的,大多数情况下这块内存没有被分配或者没有读写权限,str3 就是一个未初始化的 指向字符串的 局部指针变量,他只是刚拿到一个门牌号,还没领到具体的内存,而strcpy是通过指针对内存进行操作(也叫深拷贝),而str3还没与内存关联,这是非常dangerous的。错误原因,strcpy操作未初始化局部变量!
二.如果str3声明为全局,会报错“str3是一个空指针”,错误原因strcpy操作无效内存!
刚刚说了未初始化的局部变量指向的内存未知,没有写入权限,如果str3是全局变量呢?此时虽然没有赋值,但C会把未初始化的全局变量赋值为0,str3会默认为“空指针”——NULL,而空指针是不指向任何数据的指针,是无效指针,我们得先得分配内存,让他指向一块数据
1 char * str3;
2 str3 = (char *)malloc(8); //此时str3不再是NULL了,它已经明确的指向了堆中的一块内存;
3 strcpy(str3,"xxx"); 就可以了
三、str4肯定不行了,strcpy是操作内存的,因为这里用strcpy 操作静态数据区的常量,char *类型的str4是一个栈数据,它指向了静态数据区的常量,常量不能被改写。错误原因strcpy操作常量内存
最后,之所以选项中没有str3,估计也是因为str3太难判断了,str4错误明显一点。

因为str4是字符指针,可以直接赋值,不使用strcpy函数