字符串的浅拷贝
先来一道例题ヾ(✿゚▽゚)ノ
#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)ヾ(✿゚▽゚)ノ