memcpy的使用问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 08:05:33
我最近刚刚接触到这个函数,就试着使用它,但是我遇到了一些问题:
如果我这样写:
char p1[10]="liupeng";
char p2[5];
memcpy(p2,p1,3);
p2[3]='\0';
cout << p1 <<endl;
cout << p2 << endl;
程序可以正常运行,没有任何的问题。
但是当我把程序改为:
char *p1="liupeng";
char *p2;
memcpy(p2,p1,3);
p2[3]='\0';
cout << p1 <<endl;
cout << p2 << endl;
程序编译没有错误,但是无法运行。
另外我想利用c++中的string字符串类型来处理,定义:string p1="liupeng";string p2;同样执行上面的程序,编译时就出现了问题。
请帮我分析一下我的这些情况好吗?谢谢!

p2只是个指针,其指向的空间没有分配,当然运行不对了。

p2[5] 这样直接在栈中分配了5个字节。
char *p2 这样只是申请了一个指针,它应该指向一个可访问的内存地址。

刚分配出来很可能是NULL (0)也就是说 p2 的值是 0
那么你的memcpy(p2,p1,3);就是往 0 这个内存地址复制3个字节,会出现错误
0xXXXXXXXX 指令引用的地址 0x00000000不能为write……

正确的方法是给指针使用堆内存。
char *p2 = malloc(5);
需要注意的是:使用堆内存需要回收,它不像栈内存在一个环境中自动生成销毁,堆内存需要手动回收。其指令是
free(p2);

tacyxx说的很对,你的程序char * p2,这只是定义 p2为指针变量,其指向的空间没有分配,如果你给他一个值,比如 char *p1="liupeng",*p2;p2=p1;
那么p2就有地址了。

还有就是你定义p2只是个字符指针,那么只能存储一个字符了,就不能一下子放进去三个字符。如果是数组就可以了。

如果是数组的话,程序已经分配过地址了。

修改之后,p2作为一个指针,却没有指向任何地址,当然不可以正确执行了。memcpy的参数是char*,你用string类型当然也不好用了。