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 字节 mallocmemcpy 工作相同,它们期望字节数作为输入。那你为什么给其中一个 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) );