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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...