繁体   English   中英

使用指针和数组索引将一个数组复制到另一个数组

[英]Copying one array into another using pointers and array indexing

我编写了一个程序,它使用数组索引和指针将一个数组复制到另一个数组中。 我要解决的问题是当我 go 打印原始数组和指针方法的新数组时,我得到相同的东西(即复制的数组),而我真正想要的是打印原始数组,然后是新数组复制的数组。 (下面更清楚)

代码

/* 
Program to copy the contents of a one-dimensional character array 
into another one-dimensional character array using
2 different methods(Pointers and Array Indexing)
*/

#include <stdio.h>
// Declaring both functions
void copyArrayIndexWay(char * const newArray1, const char * const originalArray1);
void copyPointerWay(char *newArray2, const char *originalArray2);

// Little explanation - I declared both arrays here instead of in my main so that my variable size can get the size of
// either array which is used in the for loops for both functions. Hence why I had to delcare it all here if I
// wanted both functions to be able to access the size variable
char array1[] = "deeznuts";
char array2[] = "gotem";

// Declaring variables i and size here which will allow both functions to call them
int size = sizeof(array1), i = 0;

int main(){

    // copy 1 into 2
    copyArrayIndexWay(array2, array1);
    copyPointerWay(array2, array1);

}

// Functin to copy contents using array indexing
void copyArrayIndexWay(char * const newArray, const char * const originalArray){
    
    printf("--Copying Using Array Indexing--\n");
    printf("Original Array: %s\n", newArray);

    for (i=0; i<size; i++){
        newArray[i] = originalArray[i];
    }

    printf("New Array: %s\n\n\n", newArray);


}

// Function to copy contents using pointers
void copyPointerWay(char *newArray2, const char *originalArray2){
    
    // declare pointers and assign both arrays to a pointer each
    const char *orig_arrayPtr;
    orig_arrayPtr = originalArray2; // array1

    char *new_arrayPtr;
    new_arrayPtr = newArray2; // array2

    printf("--Copying Using Pointers--\n");
    printf("Original Array: %s\n", new_arrayPtr);

    for (i=0; i<size; i++){
        new_arrayPtr[i] = orig_arrayPtr[i];
    }

    printf("New Array: %s\n", new_arrayPtr);

}

OUTPUT

--Copying Using Array Indexing--
Original Array: gotem
New Array: deeznuts


--Copying Using Pointers--
Original Array: deeznuts
New Array: deeznuts

使用指针的复制应该打印与数组索引方法相同的原始数组,但由于某种原因,它会打印新数组。 任何关于为什么会发生这种情况的建议或解释将不胜感激,谢谢:)

打电话后

 copyArrayIndexWay(array2, array1);

array2array1具有相同的内容 (deeznuts)。 那么在通话中

copyPointerWay(array2, array1);

你通过“deeznuts”两次。

实际上,您通过越界访问array2来调用未定义的行为,因为它比“deeznuts”短。 但是你很幸运没有访问你不应该访问的 memory。

您可以通过多种方式解决问题,我的建议是仅传递您想要复制的原始数组(deeznuts),然后在每个 function 中声明一个足够大的数组以包含您正在传递的数组。

调用 copyPointerWay 时,Array2 已经充满了“deeznuts”。

您观察到的行为被解释为:

最初array2包含“gotem”

调用copyArrayIndexWay后, array2包含“deeznuts”

调用copyPointerWay时, array2包含“deeznuts”,并且“deeznuts”再次写入此位置。 这就是为什么您无法观察到内容的变化。

在调用copyArrayIndexWay之后,您可以为array2分配另一个值。 这样,您将观察到内容的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM