lengdao 发表于 2019-5-30 21:37:40

memcpy为什么无法实现

本帖最后由 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);
       }
       q=(int *)calloc(4,sizeof(int));
       memcpy(q,p,2);
       free(p);
       printf("%d %d %d %d\n",q,q,q,q);
       free(q);
       return 0;
}

如果输入数7和9,则输出结果是7 0 0 0这是为什么呀

ba21 发表于 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,q,q,q);
       free(q);
       return 0;
}

Krant5 发表于 2019-5-30 22:27:17

你自己给同一个地址赋值两次,给覆盖了呗,你输入的应该是 9 - 7

jornadalhl 发表于 2019-5-30 22:35:02

两个修改:
1. p本身已经是指针,在scanf()中传递p的时候不能使用&运算符,这里需要做的事scanf("%d", &p),用&运算符取数组中具体元素的地址。
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被分配的空间的后半部。

lengdao 发表于 2019-5-30 22:52:23

1.我是写的&p不知道为啥没显示全{:10_277:}
2.memcpy(q,p,2*sizeof(int))改成这样就可以显示7 9 0 0了

非常感谢各位大佬的慷慨指教

lengdao 发表于 2019-5-30 22:56:42

ba21 发表于 2019-5-30 22:12


int *tmp; // 为保证p的首地址不变,所以用tmp来移动 p
这句的意思是 为p分配空间后 它的首地址有可能会改变?
小白一枚,还请大佬多多指教
页: [1]
查看完整版本: memcpy为什么无法实现