【问题标题】:copying an array of integers to another integer array将整数数组复制到另一个整数数组
【发布时间】:2013-07-09 09:00:08
【问题描述】:
#include<stdio.h>

void int_copy(int* ptrA,int* ptrB,int nbr){
 //int* temp = ptrB;
 while(nbr != 0){
  *ptrB++ = *ptrA++;
  nbr--;
 }
 *ptrB = -1;
 //ptrB = temp;
}

int main(){
 int stringa[40] = {100,101,102,103,104,105,106,107,108,109,110,-1};
 int stringb[40] = {0};
 int *ptr;
 int *ptr1;
 int len = 0;

 ptr = stringa;
 ptr1 = stringb;

 while(*ptr != -1){
  *ptr++;len++;
 }

 printf("\n len : %d \n",len);

 int_copy(stringa,stringb,len);

 while(*ptr1 != -1){
  printf("%d\t",*ptr1);
  *ptr1++;
 }

 return 0;
}

我正在尝试将一个整数数组复制到另一个整数数组的示例程序。有没有其他更有效的方法。

已编辑:

void int_copy(int* ptrA,int* ptrB,int nbr){
 memcpy(ptrA,ptrB,(sizeof(int)*nbr));
}

【问题讨论】:

  • @Dayalrai:那不是复制
  • @KarolyHorvath 哦,是的,你是对的。我没有从那个角度思考。删除我的误导性评论。
  • 函数 int_copy temp 没有初始化,所以最后一行可能会报错。
  • 其实最后一行是删减。在此函数结束时,分配给本地“ptr”实际上什么都不做。然后也可以删除第一行。

标签: c


【解决方案1】:

不要使用标记 (-1),存储长度。

然后你可以使用memcpy - 提示:复制sizeof(int)*len字节。

【讨论】:

  • 实际上,他将nbr 作为参数传递给复制函数,所以他现在可以使用 memcpy 而不是循环
  • memcpy 很慢,它逐字节复制,但逐个处理 int 需要更少的循环迭代。
  • @GrijeshChauhan:不在我的编译器/处理器上。在我的版本中,它首先以 4 字节块(寄存器大小)复制,然后可选择复制 2 字节和 1 字节的尾部。我敢打赌,如果我有 x64,那么它将从复制 8 个字节的块开始。嗯.. 或者我记得错了,它是 memmove.. 嗯。平台特定恕我直言。
  • @quetzalcoatl:嗯,其实我更担心哨兵,因为你必须扫描阵列两次。
  • 伙计们.. 这一切都只是初始设置。他甚至可以对其进行硬编码。如果他询问如何使复制更好,那么 并不重要 如何 他如何获得数组和元素的数量.. 一旦他有输入和输出缓冲区并且知道号码,他可以使用 memcpy - 这就是答案..
【解决方案2】:

我正在尝试一个示例程序来将整数数组复制到 另一个整数数组。有没有另一种方法可以做到这一点? 有效的方法。

由于这是一个示例程序,我不确定您的实际程序是什么样的。但至于分配数组:您可以静态地(如您的示例中)或动态地使用例如malloc()。无论哪种方式,数组的大小都是已知的(在源代码中固定或间接通过 malloc 调用的 size 参数)。

所以是的,既然你应该知道数组的大小,你可以使用memcpy(),因为它的实现针对它运行的架构进行了优化,所以效率更高。

顺便说一句:一个例外可能是为您分配内存并且不提供数组长度的库。但是我从来没有遇到过这样的情况……

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2015-04-22
    • 2017-09-13
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多