5

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

#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;
}

在上面的示例中,我将一个数组从 main 函数发送到 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

4 回答 4

13
memcpy(a,b,10);

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


此外,您缺少一个#include <string.h>,这就是您收到警告的原因。

于 2013-04-03T06:13:16.543 回答
7

memcpy()函数用法如下:

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

其中num字节数。

为了解决这个问题,您需要通过以下方式使用它:

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

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

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

编辑:你也忘了#include <string.h>,所以这会导致以下编译警告:

array.c:15:2: 警告:内置函数“memcpy”的隐式声明不兼容</p>

对于将来,请注意编译器警告,因为它可以让您避免很多运行时错误。

于 2013-04-03T06:14:31.000 回答
2

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

于 2013-04-03T06:14:52.303 回答
1

你必须包括<string.h>

memcpy 的最后一个参数是“要复制的字节数”。(您正在传递元素数量)

于 2013-04-03T06:22:58.670 回答