对* target ++ = * source ++的工作非常困惑

时间:2015-01-16 03:55:18

标签: c++ arrays pointers

所以,我已经完成了我的阅读,并且我理解* p ++的含义,以及* target ++ = * source ++如何工作的基础知识。但是我对结果感到困惑。

我想将数组的内容复制到另一个数组中。很简单,除非你看一下程序运行时数组内容是如何变化的,否则我不知道为什么这是输出...

这是我的计划:

#include <stdio.h>

void printArray(int *array, int size){

    printf("{ ");
    for (int i = 0; i < size; ++i)
        printf("%d, ", array[i]);
    printf("}");

    printf("\n");
}

void copyArray(int *target, int *source, int size){

    for (int i = 0; i < size; ++i)
    {
        printf("Iteration #%d \n",i+1 );
        printf("Source Array: ");
        printArray(source, 5);

        printf("Target Array: ");
        printArray(target, 5);
        printf("\n");   

        *target++ = *source++; 
    }

}

int main(void){

    int source[] = {1, 2, 3, 4, 5};
    int target[5] = {0};

    copyArray(target, source, 11);


    return 0;
}

这是我输出的输出:

迭代#1
源数组:{1,2,3,4,5,} 目标数组:{0,0,0,0,0,}

迭代#2
源数组:{2,3,4,5,32767,}
目标数组:{0,0,0,0,0,}

迭代#3
源数组:{3,4,5,32767,-732409276,}
目标数组:{0,0,0,0,0,}

迭代#4
源数组:{4,5,32767,-732409276,1442845569,}
目标数组:{0,0,0,0,0,}

迭代#5
源数组:{5,32767,-732409276,1442845569,1583093720,}
目标数组:{0,0,0,0,1,}

迭代#6
源数组:{32767,-732409276,144245569,1583093720,32767,}
目标数组:{0,0,0,1,2,}

迭代#7
源数组:{ - 732409276,1442845569,1583093720,32767,-1844984375,}
目标数组:{0,0,1,2,3,}

迭代#8
源数组:{1442845569,1583093720,32767,-1844984375,32767,}

目标阵列:{0,1,2,3,4,}

迭代#9
源数组:{1583093720,32767,-1844984375,32767,-1844984375,}
目标阵列:{1,2,3,4,5,}

所以我有几个直接的问题: 1)当我调用该函数时,我将其传递给#34; target&#34;这是指向数组第一个元素的指针。为什么我的目标数组从最后一个位置开始填充?

2)我没有任何代码,至少没有任何自愿代码,修改了我的&#34;来源&#34;阵列。为什么会改变?

3)我的这个程序的第一个版本使用指向源的最后一个元素的指针来停止copyArray中的循环,但是当运行gdb时我注意到它返回函数需要更多的迭代而不是数组中的元素,我很好奇。通过反复试验,我发现在copyArray()中需要9次迭代才能完全复制&#34; source&#34;进入&#34;目标&#34;。这是为什么?

对此事的任何想法?

*为便于阅读而编辑

3 个答案:

答案 0 :(得分:2)

修改targetsource指针很好,但是你需要使用原始指针调用printArray,而不是移动指针。否则,在第一次迭代之后,不是打印索引0..4而是打印1..5,然后是2..6,然后是3..7 ......这些都有未定义的值,在这种特殊情况下你在尝试打印target时(在迭代5之后)最终会遇到source

你需要做这样的事情:

int* source_original = source;
int* target_original = target;
for (int i = 0; i < size; ++i)
{
    printf("Iteration #%d \n",i+1 );
    printf("Source Array: ");
    printArray(source_original, 5);

    printf("Target Array: ");
    printArray(target_original, 5);
    printf("\n");   

    *target++ = *source++; 
}

答案 1 :(得分:0)

void copyArray(int *target, int *source, int size){
  for (int i = 0; i < size; ++i)
  {
      printf("Iteration #%d \n",i+1 );
      printf("Source Array: ");
      printArray(source, 5);

      printf("Target Array: ");
      printArray(target, 5);
      printf("\n");   

      *target++ = *source++; 
  }

}

你不能这样做。您不断更改目标和源点的位置,然后从此新值开始打印。这就像在一条只有5栋房子然后是悬崖的街道上读取房屋的数字。当你到达5时,你会读完最后一所房子,然后走出悬崖再读4个数字。

目标数组似乎正确的唯一原因可能是因为值被复制到堆栈上。试试这个。

void copyArray(int *target, int *source, int size){
  int * originalTarget = target, int * originalSource = source;
  for (int i = 0; i < size; ++i)
  {
      printf("Iteration #%d \n",i+1 );
      printf("Source Array: ");
      printArray(originalSource, 5);

      printf("Target Array: ");
      printArray(originalTarget, 5);
      printf("\n");   

      *target++ = *source++; 
  }

}

现在虽然您正在更改targetsource,但您打印的值将始终从原始指针开始,因此可以安全地进行迭代。这应该允许您更改主函数以调用copyArrays,如此

copyArray(target, source, 5);

答案 2 :(得分:0)

自恐龙以来,我一直没有c ++。

但我觉得这句话: *target++ = *source++; 没有做你的想法。
我认为正在发生的事情是* source ++将一些未知的(下一个序列记忆adddress)读作整数值。

copyArray(int &target, int &source, int size)