如何解决C动态数组不正确的数字
我非常感谢一些解释,为什么我滥用memcpy,即为什么以下代码的输出不正确:
int main()
{
int array[5] = {1,2,3,4,5};
int *ptr = malloc(sizeof(int) * 5);
memcpy(ptr,array,5);
printf("%d\n",ptr[0] );
printf("%d\n",ptr[1] );
printf("%d\n",ptr[2] );
printf("%d\n",ptr[3] );
printf("%d\n",ptr[4] );
free(ptr);
return 0;
}
输出为:1 2 0 0 0
解决方法
memcpy()
的第三个参数是要复制的字节个字节,而不是个元素。
在这种情况下,
memcpy(ptr,array,5);
应该是
memcpy(ptr,sizeof(int) * 5);
或
memcpy(ptr,sizeof(*ptr) * 5);
或
/* copy the whole array,no *5 in this case */
memcpy(ptr,sizeof(array));
,
这很糟糕,因为您有5个int
数组,但您memcpy
有5个字节。 malloc
和memcpy
的工作原理相同,它们期望字节数作为输入。那么,为什么要给其中一个sizeof(int) * 5
和另一个5
?
为什么我误用了memcpy,即以下代码的输出为何不正确
memcpy()将指定数量的字节从源缓冲区复制到目标缓冲区。
声明:
int *ptr = malloc(sizeof(int) * 5);
创建一个指向内存的指针,该内存具有5个整数(即5*sizeof(int)
)的空间
同样,该语句:
int array[5] = {1,2,3,4,5};
创建一个int
array
,并为5
int
提供空间。 (再次-5*sizeof(int)
),但是您的memcpy()
语句仅复制array
的一部分:
memcpy(ptr,5);
插图:假设sizeof(int) == 4
,下面显示了array
正在复制的部分:
|0001|0002|0003|0004|0005|
|---- -| first 5 bytes
因此,仅复制array
的前5个字节,而它需要复制所有5*sizeof(int) == 20
字节。将该语句更改为:
memcpy(ptr,5*sizeof(int));
,
关于;
memcpy(ptr,5);
这将复制5个字节,您要在其中复制5个整数。建议;
memcpy(ptr,5*sizeof(int) );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。