先来一道例题ヾ(✿゚▽゚)ノ
#include<stdio.h> int main() { char buf[3]; char *arr[3];//指针数组 int i; for(i=0;i<3;i++) { scanf("%s",buf); arr[i]=buf;//代表数组元素首地址 } for(i=0;i<3;i++) { printf("%s\n",arr[i]); } }我们输入的值为:“aaa”、“bbbbb”、“cccc”
我们希望的结果是“aaa”、“bbbbb”、“cccc”
然而...运行结果却是...
这是为什么呢o(゚Д゚)っ!
这就引出了字符串的浅拷贝问题啦
来一个图解,大家就比较好理解整个过程啦,最后也会给出正确的拷贝方法,大家也可以先仔细思考一下ヾ(゚∀゚ゞ)
可以发现每一次传进arr中存的都是地址,每一次地址是一样的因为buf只有一个格子,最后一次存的是“cccc”,所以很好理解为什么最后的结果是三次“cccc”了,这就属于字符串的浅拷贝问题了,以下给出修改方法:
应该再申请一个动态内存,去解决此问题
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char buf[3]; char *arr[3];//指针数组 int i; for(i=0;i<3;i++) { scanf("%s",buf); arr[i]=(char *)malloc(strlen(buf+1)*sizeof(char)); strcpy(arr[i],buf); } for(i=0;i<3;i++) { printf("%s\n",arr[i]); } for(i=0;i<3;i++) { free(arr[i]); } }运行结果截图:
(红色为修改部分)
这就是这一部分的内容啦❤祝大家都能0 error(s),0 warning(s)ヾ(✿゚▽゚)ノ
