复制缓冲区和数组不起作用

6

我有一个需求,需要将一个空数组作为参数传递给一个函数。在这个被调用的函数中,我应该将一些数据复制到传递的数组中。所以我写了一个小例子,它与我的要求相同。以下是它的代码:

#include <stdio.h>
#include <stdlib.h>
void printArr(int *a)
{
    int i;
    int *b=(int*)malloc(sizeof(int)*10);
    printf("\n\nEnter 10 lements:\n");
    for(i=0;i<10;i++)
        scanf("%d",&b[i]);

    printf("\nContents of array b:\n");
    for(i=0;i<10;i++)
        printf("%d\t",b[i]);
    printf("\n");
    memcpy(a,b,10);
    printf("\nContents of array a:\n");
    for(i=0;i<10;i++)
        printf("%d\t",a[i]);
    printf("\n");
}
int main()
{
    int a[10];
    printArr(a);
    return 0;
}

在上面的例子中,我从主函数向printArr函数发送了一个数组。在被调用的函数中,数据将被memcpy到数组中。当数组内容被打印时,我得到一些垃圾值。同时编译会出现下面所示的警告:
$ gcc -o arr array.c
array.c: In function ‘printArr’:
array.c:15:2: warning: incompatible implicit declaration of built-in function ‘memcpy’

上述程序的输出如下所示:
Enter 10 lements:
0 1 2 3 4 5 6 7 8 9

Contents of array b:
0   1   2   3   4   5   6   7   8   9   

Contents of array a:
0   1   134479874   11136160    11136160    11132916    134514160   134513696   134514171   11132916    

请有人告诉我上面的程序有什么问题。

注意: 我需要使用memcpy而不是for循环将数据从缓冲区复制到传递的数组,原因是我的实际程序性能需要。

提前感谢。

4个回答

15
memcpy(a,b,10);

第三个参数是要复制的字节数。你要使用memcpy(a, b, 10 * sizeof *a)


另外,你缺少一个#include <string.h>,这就是为什么会出现警告的原因。


完美的...非常感谢,运行得非常好。我会在10分钟内接受你的答案。但是为什么需要string.h呢? - Zax
@Zax 对于memcpy原型。 - cnicutar
包括string.h甚至移除了警告。谢谢。 - Zax

7

memcpy()函数的使用方法如下:

 void * memcpy ( void * destination, const void * source, size_t num );

其中num是字节数。

要解决此问题,您需要按以下方式使用它:

memcpy(a,b,10*sizeof(int));

通常情况下,整数的大小为4字节(取决于平台、编译器等)。

在您的程序中,您只复制了10个字节而不是40个字节。因此,在这种情况下,您将获得数组a[]中初始化的第一个"2.5"元素,其余部分包含垃圾数据。

编辑:您还忘记了#include <string.h>,这会导致以下编译警告:

array.c:15:2: warning: incompatible implicit declaration of built-in function ‘memcpy’

对于未来,请注意编译器警告,这将帮助您避免许多运行时错误。


2
memcpy的最后一个参数是要复制的字节数,因此应该是memcpy(a,b, 10 * sizeof(int));

1
你需要包含<string.h>
memcpy的最后一个参数是“要复制的字节数”。(你正在传递元素数量) 。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接