c - 我如何编写一个函数来复制一个项目数组,用于复制一些定义数量的项目

标签 c pointers

我正在尝试学习如何使用指针,并想编写一个函数,其中我有两个整数数组,并想复制一个整数数组以复制特定数量 (nbr) 的整数。

int A[]= {1,2,3,4};
int B[] = {6,7,8,9};

int main(void)
{
    int_copy(&A, &B, 3);
}

void int_copy(int *ptrA, int *ptrB, int nbr)
{
    int * p = ptrA;
    for (int i = 0; i<nbr; i++)
    {
        *ptrA++ = *ptrB++;
    }

    printf("%d\n", *ptrA);
    printf("%d\n", *ptrB);

    return;
}

我想为数组 A 输出 6,7,8,4,但我收到以下错误消息:

intcopy.c:10:14: warning: incompatible pointer types passing 'int (*)[4]' to parameter of type 'int *' [-Wincompatible-pointer-types]
    int_copy(&A, &B, 3);
             ^~

intcopy.c:6:20: note: passing argument to parameter 'ptrA' here
void int_copy(int *ptrA, int *ptrB, int nbr);
                   ^

intcopy.c:10:18: warning: incompatible pointer types passing 'int (*)[4]' to parameter of type 'int *' [-Wincompatible-pointer-types]
    int_copy(&A, &B, 3);
                 ^~

intcopy.c:6:31: note: passing argument to parameter 'ptrB' here
void int_copy(int *ptrA, int *ptrB, int nbr);
                              ^

最佳答案

要点是:如果传递给函数,数组会自动衰减为指向其第一个元素的指针。所以你只需像这样调用你的函数

int_copy(A, B, 3);

获取数组的地址可能的,并且由于数组和它们的第一个元素总是共享相同的地址,将产生相同的数值。但是指针的类型不同,它不是指向 int 的指针,而是指向长度为 4 的 int 数组的指针:

int(*pointer)[4] = &A;

语法很丑,我知道...

I want to output 6,7,8,4 for array A

假设这就是您首先备份 ptrA 的原因?只是,您不使用它...

printf("%d\n", *ptrA);
printf("%d\n", *ptrB);

这两个语句将分别打印一个整数,即两个指针指向的整数。当您在循环中将它们都推进 3 时,它们将打印出来 49

您需要使用备用指针 p 并在另一个循环中迭代恰好四个元素。唯一的:你的复制函数不知道有多少数组元素。在某些限制条件下,以这种方式打印可能是可行的,但它是危险的代码。想象一下,如果您将指针传递到数组中间的某个位置(-> 由于读取超出数组边界而导致的未定义行为!)会发生什么。

安全的方法是不在被调用的函数中打印,而是:

int main(void)
{
    int_copy(&A, &B, 3);
    for(size_t i = 0; i < sizeof(A)/sizeof(*A); ++i)
        printf("%d ", A[i]);
}

最后:您不需要在 void 函数中显式return(仅当您想提前退出时...)。

关于c - 我如何编写一个函数来复制一个项目数组,用于复制一些定义数量的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673604/

相关文章:

带有 shared_ptr 的 C++ openmp

c++ - 二维字符指针数组 --> 段错误?

ruby - Ruby如何通过值和指针区分VALUE?

c++ - 如何填充包含指针数组的结构体数组

c - memcpy() 将整数值复制到字符缓冲区

C编程,一个宏改变两个位置

c - 在C中为字符串动态分配内存时,是否计算字符串char的\0结尾?

c - 在 C 中扩展动态 char** 数组时 realloc() 失败

java - 将 Java GUI 添加到 C 客户端

c - 如何解决 "undefined reference to function"错误?