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这是为什么呀 #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;
} 你自己给同一个地址赋值两次,给覆盖了呗,你输入的应该是 9 - 7 两个修改:
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被分配的空间的后半部。 1.我是写的&p不知道为啥没显示全{:10_277:}
2.memcpy(q,p,2*sizeof(int))改成这样就可以显示7 9 0 0了
非常感谢各位大佬的慷慨指教
ba21 发表于 2019-5-30 22:12
int *tmp; // 为保证p的首地址不变,所以用tmp来移动 p
这句的意思是 为p分配空间后 它的首地址有可能会改变?
小白一枚,还请大佬多多指教
页:
[1]