【问题标题】:C dynamic array inproper figuresC动态数组不正确的数字
【发布时间】:2020-12-22 17:26:26
【问题描述】:

我非常感谢一些解释,为什么我滥用 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*sizeof(int));//复制array的所有20个字节,而不仅仅是5个。
  • 如果代码需要复制array,简化分配到array的大小:int *ptr = malloc(sizeof array);

标签: arrays c dynamic malloc memcpy


【解决方案1】:

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));

【讨论】:

  • UV 为简单的memcpy(ptr, array, sizeof array);。跳过不需要的5 部分。
【解决方案2】:

这很糟糕,因为您有一个由 5 个int 组成的数组,但您有一个 memcpy 5 个字节mallocmemcpy 工作方式相同,它们希望输入字节数。那你为什么给他们一个sizeof(int) * 5和另一个5

【讨论】:

  • 非常感谢。我错过了这个,小细节。
  • @WojciechMierzejewski - 您可以通过单击空心复选标记来接受此答案。这真的是在这个网站上表达感谢的最佳方式:)
【解决方案3】:

为什么我滥用 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, 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));

【讨论】:

    【解决方案4】:

    关于;

    memcpy(ptr, array, 5);
    

    这会复制 5 个字节,您要在其中复制 5 个整数。建议;

    memcpy(ptr, array, 5*sizeof(int) );
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2020-07-31
      相关资源
      最近更新 更多