鱼C论坛

 找回密码
 立即注册
查看: 1804|回复: 5

[已解决]memcpy为什么无法实现

[复制链接]
发表于 2019-5-30 21:37:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lengdao 于 2019-5-30 21:46 编辑

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
       int  *p=NULL;
       int  *q=NULL;
       int i;
       p=(int *)calloc(2,sizeof(int));
       for(i=0;i<2;i++)
       {
           printf("请输入第%d个数:\n",i+1);
           scanf("%d",&p[i]);
       }
       q=(int *)calloc(4,sizeof(int));
       memcpy(q,p,2);
       free(p);
       printf("%d %d %d %d\n",q[0],q[1],q[2],q[3]);
       free(q);
       return 0;
}

如果输入数7和9,则输出结果是7 0 0 0  这是为什么呀
最佳答案
2019-5-30 22:12:44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
       int *p=NULL;
       int *q=NULL;
           int *tmp; // 为保证p的首地址不变,所以用tmp来移动 p
       int i;

       p= (int *)calloc(2,sizeof(int));
        tmp = p;
       for(i=0;i<2;i++)
       {
           printf("请输入第%d个数:\n",i+1);
           scanf("%d",tmp); // 你的编译器很神奇 加&能工作
                   tmp++; // 移动到下一个地址接收用户输入
       }

       q=(int *)calloc(4,sizeof(int));
       memcpy(q,p,2*sizeof(int)); // memcpy 是按字节来计算的,所以2*sizeof(int)
       free(p);
       printf("%d %d %d %d\n",q[0],q[1],q[2],q[3]);
       free(q);
       return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-30 22:12:44 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
       int *p=NULL;
       int *q=NULL;
           int *tmp; // 为保证p的首地址不变,所以用tmp来移动 p
       int i;

       p= (int *)calloc(2,sizeof(int));
        tmp = p;
       for(i=0;i<2;i++)
       {
           printf("请输入第%d个数:\n",i+1);
           scanf("%d",tmp); // 你的编译器很神奇 加&能工作
                   tmp++; // 移动到下一个地址接收用户输入
       }

       q=(int *)calloc(4,sizeof(int));
       memcpy(q,p,2*sizeof(int)); // memcpy 是按字节来计算的,所以2*sizeof(int)
       free(p);
       printf("%d %d %d %d\n",q[0],q[1],q[2],q[3]);
       free(q);
       return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 22:27:17 | 显示全部楼层
你自己给同一个地址赋值两次,给覆盖了呗,你输入的应该是 9 - 7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 22:35:02 | 显示全部楼层
两个修改:
1. p本身已经是指针,在scanf()中传递p的时候不能使用&运算符,这里需要做的事scanf("%d", &p[i]),用&运算符取数组中具体元素的地址。
2. memcpy里第三个参数是字节数,这里应该是memcpy(q, p, 2 * sizeof(int)).
另外因为q被分配的内存是4个int的空间,第一句memcpy()只会将p所指向的两个值copy到q分配的空间的前半部,所以在memcpy(q, p, 2 * sizeof(int))后还需要再加一句memcpy(q + 2, p, 2 * sizeof(int))来copy p所分配的空间内的值到q被分配的空间的后半部。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-30 22:52:23 | 显示全部楼层
1.我是写的&p[i]  不知道为啥没显示全
2.memcpy(q,p,2*sizeof(int))  改成这样就可以显示7 9 0 0了

非常感谢各位大佬的慷慨指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-30 22:56:42 | 显示全部楼层

int *tmp; // 为保证p的首地址不变,所以用tmp来移动 p
这句的意思是 为p分配空间后 它的首地址有可能会改变?
小白一枚,还请大佬多多指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 19:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表