关于new分配内存的问题!!

2890706289 2018-09-06 08:53:57
#include <iostream>
using namespace std;

void fStrcat(char *s1,char *s2);

int main(void){
char str[6]={'b','y','e','b','y','e'};
char *str2;
fStrcat(str2,str);
cout<<str2<<endl;
return 0;
}

void fStrcat(char *s1,char *s2) {
char *fis=s1,*sec=s2;
fis = new char(6);//问题出现在这里,我在这里分配内存出现了错误
while(*sec != '\0') {
*fis = *sec;
fis++;
sec++;
}
*fis = '\0';
}



对于这个问题,我要是把内存分配语句放在main函数里就能正确运行并显示正确结果。
...全文
242 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
2890706289 2018-09-06
  • 打赏
  • 举报
回复
引用 5 楼 qq_43086055 的回复:
补充下
char *fis=s1,*sec=s2; // fis=s1 这句其实是没用的,你下面马上有把它指到分配空间上了。 所以fStrcat函数要像楼上说的传指针引用进来,或者最好的是在函数外分配内存,然后函数内只做字符串操作


抱歉,再打扰你一下:
#include <iostream>
using namespace std;

void fStrcat(char* &fis,char *sec);

int main(void){
char str[7]={'b','y','e','b','y','e','\0'};
char *str2;
str2 = new char(7);
fStrcat(str2,str);
cout<<str2<<endl;
return 0;
}

void fStrcat(char* &fis,char *sec) {
while(*sec != '\0') {

*fis = *sec;
fis++;
sec++;
}
*fis = '\0';
}


我改成这样了,还是不行,但是把引用符删掉却运行正常了。
2890706289 2018-09-06
  • 打赏
  • 举报
回复
谢谢各位了,我明白了。
qq_43086055 2018-09-06
  • 打赏
  • 举报
回复
补充下
char *fis=s1,*sec=s2; // fis=s1 这句其实是没用的,你下面马上有把它指到分配空间上了。 所以fStrcat函数要像楼上说的传指针引用进来,或者最好的是在函数外分配内存,然后函数内只做字符串操作
qq_43086055 2018-09-06
  • 打赏
  • 举报
回复
你这代码写的,都可以当捉虫比赛的题了

void fStrcat(char *s1,char *s2);

int main(void){
char* str=“byebye" //字符串结尾要有结束符,不然你下面的循环会越界
char *str2;
fStrcat(str2,str);
cout<<str2<<endl;
return 0;
}

void fStrcat(char *s1,char *s2) {
char *fis=s1,*sec=s2; // fis=s1 这句其实是没用的,你下面马上有把它指到分配空间上了
fis = new char[7]; // 预留结束符的空间,其实你这种实现在函数外面传个指针,然后内部分配空间比较怪。 建议这句移到main函数里。另外就是如果确定字符串长度这样写没问题, 不然要分配足够长的空间
while(*sec != '\0') {
*fis = *sec;
fis++;
sec++;
}
*fis = '\0';
}
NexTor 2018-09-06
  • 打赏
  • 举报
回复
主要是函数传参问题吧,str2作为值拷贝,在函数中s1被指到其他地址上,但main中str2并没有改变,所以最后显示不出结果。
可以改为void fStrcat(char* & s1,char *s2);或void fStrcat(char **s1,char *s2);把指针值传出来。
另外有些数组越界的问题,需要考虑
月凉西厢 2018-09-06
  • 打赏
  • 举报
回复
你这代码问题很大。。
首先fStrcat(str2,str);,第一个参数是char*,但是却没有分配内存,第二个参数实际传入根本不是字符串,因此最起码应该把长度6传进去。
更严重的是你在fstrcat内部将s1赋值给了fis后,fis已经有值,而new的返回又是另一个地址,这时候fis=new XX()这句到底是什么意思呢?难道是在fis原先指向的地址开辟一块内存?这显然是不可能的;靠谱的解释是new生成一个指向堆内存的新地址,然后赋值给fis,这将导致fis与传入参数s1的指向不再一样。即s1不会发生变化,仍然未初始化,更别说指向新分配的内存了。
还有*sec != '\0',str2是个字符串数组,并且它的结尾不是'\0',你做这样的循环,结果就是越界访问。
sevancheng 2018-09-06
  • 打赏
  • 举报
回复
new char[6]
qq_43086055 2018-09-06
  • 打赏
  • 举报
回复
是要把引用符删掉, 你已经改成在外面分配内存了, 只需要传值进去,函数把这块内存区域填充起来就行。 如果传引用的话,函数内指针操作会改变原来指针的位置
月凉西厢 2018-09-06
  • 打赏
  • 举报
回复
引用 7 楼 qq_36876659 的回复:
[quote=引用 5 楼 qq_43086055 的回复:]
补充下
char *fis=s1,*sec=s2; // fis=s1 这句其实是没用的,你下面马上有把它指到分配空间上了。 所以fStrcat函数要像楼上说的传指针引用进来,或者最好的是在函数外分配内存,然后函数内只做字符串操作


抱歉,再打扰你一下:
#include <iostream>
using namespace std;

void fStrcat(char* &fis,char *sec);

int main(void){
char str[7]={'b','y','e','b','y','e','\0'};
char *str2;
str2 = new char(7);
fStrcat(str2,str);
cout<<str2<<endl;
return 0;
}

void fStrcat(char* &fis,char *sec) {
while(*sec != '\0') {

*fis = *sec;
fis++;
sec++;
}
*fis = '\0';
}


我改成这样了,还是不行,但是把引用符删掉却运行正常了。[/quote]
char*& fis;的方式虽然完成了赋值,但是由于是引用,fis也就是str2的指向往后移动了6个char,函数结尾处*fis='\0',也就意味str2='\0';
你现在需要的是一个再函数中能被修改而main中保持不变的东西,这种情况显然需要使用指针的副本,因此直接fstrcat{char* fis,char*sec)即可。
另外楼上有楼层已经指出了,建立长度为7的char数组应该用str2=new char[7];
你写的new char(7)是新建一个值为7的单个char。虽然你new char(7)编译和运行都不会报错,但已经访问越界了

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧