C动态数组不正确的数字
C dynamic array inproper figures
非常感谢一些解释,为什么我滥用 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, array, sizeof(int) * 5);
或
memcpy(ptr, array, sizeof(*ptr) * 5);
或
/* copy the whole array, no *5 in this case */
memcpy(ptr, array, sizeof(array));
这很糟糕,因为您有一个 5 int
的数组,但您 memcpy
5 字节 。 malloc
和 memcpy
工作相同,它们期望字节数作为输入。那你为什么给其中一个 sizeof(int) * 5
而另一个 5
?
为什么我误用了 memcpy 即为什么下面代码的输出不正确
memcpy() 将指定数量的字节从源缓冲区复制到目标缓冲区。
声明:
int *ptr = malloc(sizeof(int) * 5);
使用 space 为 5 个整数创建指向内存的指针,(即 5*sizeof(int)
)
同样,声明:
int array[5] = {1, 2, 3, 4, 5};
为 5
int
创建 int
array
space。 (再次 - 5*sizeof(int)
)但是你的 memcpy()
语句只复制了 array
:
的一部分
memcpy(ptr, array, 5);
说明:假设 sizeof(int) == 4
下面显示了 array
被复制的部分:
|0001|0002|0003|0004|0005|
|---- -| first 5 bytes
因此,只复制array
的前5个字节,而需要复制所有5*sizeof(int) == 20
个字节。将语句更改为:
memcpy(ptr, array, 5*sizeof(int));
关于;
memcpy(ptr, array, 5);
这复制了5个字节,这里你要复制5个整数。建议;
memcpy(ptr, array, 5*sizeof(int) );
非常感谢一些解释,为什么我滥用 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, array, sizeof(int) * 5);
或
memcpy(ptr, array, sizeof(*ptr) * 5);
或
/* copy the whole array, no *5 in this case */
memcpy(ptr, array, sizeof(array));
这很糟糕,因为您有一个 5 int
的数组,但您 memcpy
5 字节 。 malloc
和 memcpy
工作相同,它们期望字节数作为输入。那你为什么给其中一个 sizeof(int) * 5
而另一个 5
?
为什么我误用了 memcpy 即为什么下面代码的输出不正确
memcpy() 将指定数量的字节从源缓冲区复制到目标缓冲区。
声明:
int *ptr = malloc(sizeof(int) * 5);
使用 space 为 5 个整数创建指向内存的指针,(即 5*sizeof(int)
)
同样,声明:
int array[5] = {1, 2, 3, 4, 5};
为 5
int
创建 int
array
space。 (再次 - 5*sizeof(int)
)但是你的 memcpy()
语句只复制了 array
:
memcpy(ptr, array, 5);
说明:假设 sizeof(int) == 4
下面显示了 array
被复制的部分:
|0001|0002|0003|0004|0005|
|---- -| first 5 bytes
因此,只复制array
的前5个字节,而需要复制所有5*sizeof(int) == 20
个字节。将语句更改为:
memcpy(ptr, array, 5*sizeof(int));
关于;
memcpy(ptr, array, 5);
这复制了5个字节,这里你要复制5个整数。建议;
memcpy(ptr, array, 5*sizeof(int) );