C++ 输出端的逻辑错误

C++ 输出端的逻辑错误,c++,arrays,pointers,allocation,C++,Arrays,Pointers,Allocation,我正在开发一个程序,它使用指针创建动态数组,然后重新分配它 问题是程序运行成功,但输出错误。任何帮助都将不胜感激 int main() { int n; cout<<"Please enter the size of the array: "; cin>>n; int *arr1; arr1 = new int[n]; int *arr1_1; arr1_1=arr1; cout<<"Ent

我正在开发一个程序,它使用指针创建动态数组,然后重新分配它

问题是程序运行成功,但输出错误。任何帮助都将不胜感激

int main()
{
    int n;
    cout<<"Please enter the size of the array: ";
    cin>>n;

    int *arr1;
    arr1 = new int[n];
    int *arr1_1;

    arr1_1=arr1;

    cout<<"Enter "<<n<<" elements in the array \n";
    int x=0;

    while(x<n)
    {
        cin>>arr1[0];
        arr1++;
        x++;
    }

    x=0;
    arr1=arr1_1;

    cout<<"Here's what you've inserted in the array: \n";
    while(x<n)
    {
        cout<<arr1[0]<<endl;;
        arr1++;
        x++;
    }

    arr1=arr1_1;

    cout<<"\n\n";
    cout<<"Do you want to extend the size of the array? \nAnswer with 'Y' or 'N'. "<<endl;
    char ans;
    cin>>ans;

    int n1;
    if(ans=='Y' || ans=='y'){
        cout<<"According to you, What should be the new size of array? ";
        cin>>n1;
        cout<<"You can enter new elements in your existing array now.\n"; 
    }
    else{
        cout<<"Ok, then! Have a nice day.";
    }

    int *arr2, *arr2_1;

    arr2=(int *) realloc (arr1, n1*sizeof(int));

    arr2_1=arr2;
    x=0;

    while(x<n)
    {
        arr2[0]=arr1[0];
        arr1++;
        arr2++;
        x++;
    } 

    x=n;
    while(x<n1){
        cin>>arr2[n+1];
        arr2++;
        x++;
    }
    arr2=arr2_1;
    x=0;


    while(x<n1){
        cout<<arr2[0]<<endl;
        arr2++;
        x++;
    }

    return 0;
}
intmain()
{
int n;
coutn;
int*arr1;
arr1=新整数[n];
int*arr1_1;
arr1_1=arr1;

CUT< P>有两个主要问题:第一个问题是使用两个不同的系统进行内存分配。两个代码< < <代码> >代码> RealCalc>代码>返回指针,但是<代码>新< /COD>和 ReLoCU</代码>不是同一系统的一部分,不应该混合。C++或C,不混合。< /P> 第二个问题是,当您第二次读入数据时,您没有重置
arr2
以指向从上面的复制循环中分配的数据的开始,因此您写入了越界

此外,如果您决定使用C方式并使用
malloc
realloc
free
,您应该知道
realloc
正是这样做的,它重新分配现有内存,包括复制数据,因此您不必手动复制。此外,为什么要使用
relloc
(以及复制)首先,您要做的第一件事是什么时候覆盖所有数据



作为补充说明,我认为学习指针及其工作原理是很好的,但在将来,当您想使用“动态数组”时第一个问题是,你使用两个不同的系统进行内存分配。都是< C++ >新< /COD>和 ReLoC/ >返回指针,但是<代码>新< /COD>和 ReLoC/不属于同一系统的一部分,不应该混合。不要混在一起

第二个问题是,当您第二次读入数据时,您没有重置
arr2
以指向从上面的复制循环中分配的数据的开始,因此您写入了越界

此外,如果您决定使用C方式并使用
malloc
realloc
free
,您应该知道
realloc
正是这样做的,它重新分配现有内存,包括复制数据,因此您不必手动复制。此外,为什么要使用
relloc
(以及复制)首先,您要做的第一件事是什么时候覆盖所有数据



作为补充说明,我认为学习指针及其工作原理是很好的,但将来当您想要使用“动态数组”时,您应该使用它。

我已经修改了您的代码并对其进行了注释。我希望它能帮助您:

#include <iostream>

using namespace std;

int main()
{
    //int n;//CALL YOUR VARIABLES WITH SUGGESTIVE NAMES
    int array_size;

    do
    {
        cout << "Please enter the size of the array: ";
        cin >> array_size;
    }
    while(array_size <= 0);//you don't want a pointer which points to 0 elements or less


    int* arr1 = nullptr;//INITIALIZE YOUR POINTERS TO NULL or nullptr (C++11)
    arr1 = new int[array_size];
    int* arr1_1 = nullptr;

    arr1_1 = arr1;
    //arr1_1 is pointing to the same memory location of arr1
    //So once you delete arr1 or arr1_1 pointer, you don't have anymore to free the same memory location
    //If you do it, you will probably have an error.

    cout << "\nEnter "<< array_size <<" elements in the array:\n";

    //int x=0;
    //WHY ARE YOU USING A WHILE LOOP? THIS IS REALLY THE CASE WHERE YOU SHOULD USE A FOR LOOP
    //CAUSE YOU KNOW EXACTLY THE NUMBER OF TIMES THE LOOP IS GOING TO ITERATE.
    //while(x<n)
    //{
    //cin>>arr1[0];//WHY arr1[0]? YOU ARE GOING TO PUT AND OVERRIDE ALL THE ELEMENTS IN THE FIRST POSITION
    //arr1++;
    //x++;
    //}

    for(int i=0; i<array_size; ++i)
    {
        cout << "Enter your "<< i + 1 << ". number: ";
        cin >> arr1[i];//YOU HAVE TO PUT THE ELEMENT AT THE 'i' POSITION
    }

    //x=0;//YOU DON'T NEED ANYMORE THIS VARIABLE BECAUSE YOU SHOULD USE A FOR LOOP

    arr1=arr1_1;//WHAT EXACTLY IS THIS? THEY ARE ALREADY POINTING TO THE SAME MEMORY LOCATION
    //SO THIS ASSIGNMENT IS SUPERFLOUS

    cout << "\nHere's what you have inserted in the array: \n";

    //STILL: USE A FOR LOOP ;)
    //while(x<n)
    //{
    //  cout<<arr1[0]<<endl;;
    // arr1++;
    //x++;
    //}

    for(int i=0; i<array_size; ++i)//JUST 1 STATEMENT, YOU DON'T NEED PARENTHESIS
        cout << "Element number "<< i + 1 << " is: "<< arr1_1[i] << '\n';


    //arr1=arr1_1;

    cout<<"\n\n";
    cout<<"Do you want to extend the size of the array? \nAnswer with 'Y' or 'N'. "<<endl;
    char ans;
    cin >> ans;

    //int n1;//SUGGESTIVE NAMES HELP YOU TO READ THE CODE WHEN YOU WILL NEED TO DO IT
    int new_size;

    bool isSizeChanged = false;

    if(ans=='Y' || ans=='y')
    {
        isSizeChanged = true;//YOU WILL SEE AT THE END, 
         //WHEN YOU WANT TO FREE THE POINTERS, THAT THIS VARIABLE IS USEFUL

        cout<<"According to you, what should be the new size of array? ";
        cin >> new_size;

        if(new_size > 0)//YOU DON'T WANT TO MAKE arr1_1 INITIALIZE WITH 0 ELEMENTS
        {
            cout<<"You can enter new elements in your existing array now.\n";
        //YOU SHOULD PUT HERE THE CODE WHICH REALLOCATES MEMORY

        //Both arr1 and arr1_1 are pointing to the same memory location, 
        //but you can make 1 of them to point to another location!

            arr1_1 = new int[new_size];

            //COPYING THE ELEMENTS FROM arr1 TO arr1_1, 
            //WHICH NOW IS POINTING TO A DIFFERENT MEMORY LOCATION

            if(new_size >= array_size)//NOTE THAT IF THIS CONDITION IS TRUE, YOU WILL HAVE SOME LOCATIONS POINTED WITH RANDOM VALUES!!!
            {
                for(int i=0; i<array_size; ++i)
                    arr1_1[i] = arr1[i];
            }
            else//new_size is less than array_size
            {
                for(int i=0; i<new_size; ++i)//NOTE THAT NOW I AM USING new_size
                    arr1_1[i] = arr1[i];
            }

            cout << "\nYour new array contains:\n";

            for(int i=0; i<new_size; ++i)
                cout << "Element number "<< i +1 << ". is: "<<arr1_1[i] << '\n';

        }
        else
            cout << "Sorry, we cannot change the size of the pointer to 0 or less.\n";
    }
    else
        cout<<"Ok, then! Have a nice day.";

    //WHY ARE YOU DECLARING A NEW POINTERS?
    //YOU CAN USE 1 OF THE PREVIOUS POINTERS
    //int *arr2, *arr2_1;

    //YOU SHOULDN'T USE THE C STYLE TO REALLOCATE A POINTER, IT'S HARDER TO DO IT
    //arr2=(int *) realloc (arr1, n1*sizeof(int));

    //arr2_1=arr2;//OK, THIS WOULD HAVE WORKED :)
    //x=0;

    //I WOULD SUGGEST YOU TO USE A FOR LOOP ALSO IN THIS SITUATION
    //while(x<n)
    //{
    //arr2[0]=arr1[0];//YOU ARE COPYING THE FIRST ELEMENT OF arr1 TO THE FIRST ELEMENT OF arr2, ALWAYS!!
    //arr1++;
    //arr2++;
    //x++;
    //}

    /*
    x=n;
    while(x<n1)
    {
        cin>>arr2[n+1];
        arr2++;
        x++;
    }
    arr2=arr2_1;
    x=0;


    while(x<n1)
    {
        cout<<arr2[0]<<endl;
        arr2++;
        x++;
    }*/


    //FREEING THE MEMORY POINTED MY THE 2 POINTERS
    if(isSizeChanged)
    {
        delete [] arr1;
        delete [] arr1_1;
    }
    else
        delete [] arr1;//YOU JUST NEED TO DELETE OR arr1 or arr1_1 
         //BECAUSE THEY ARE STILL POINTING TO THE SAME MEMORY LOCATION

    return 0;
}
#包括
使用名称空间std;
int main()
{
//int n;//使用提示性名称调用变量
int数组的大小;
做
{
cout>数组大小;
}

虽然(array_size我已经修改了您的代码并对其进行了注释。我希望它能够帮助您:

#include <iostream>

using namespace std;

int main()
{
    //int n;//CALL YOUR VARIABLES WITH SUGGESTIVE NAMES
    int array_size;

    do
    {
        cout << "Please enter the size of the array: ";
        cin >> array_size;
    }
    while(array_size <= 0);//you don't want a pointer which points to 0 elements or less


    int* arr1 = nullptr;//INITIALIZE YOUR POINTERS TO NULL or nullptr (C++11)
    arr1 = new int[array_size];
    int* arr1_1 = nullptr;

    arr1_1 = arr1;
    //arr1_1 is pointing to the same memory location of arr1
    //So once you delete arr1 or arr1_1 pointer, you don't have anymore to free the same memory location
    //If you do it, you will probably have an error.

    cout << "\nEnter "<< array_size <<" elements in the array:\n";

    //int x=0;
    //WHY ARE YOU USING A WHILE LOOP? THIS IS REALLY THE CASE WHERE YOU SHOULD USE A FOR LOOP
    //CAUSE YOU KNOW EXACTLY THE NUMBER OF TIMES THE LOOP IS GOING TO ITERATE.
    //while(x<n)
    //{
    //cin>>arr1[0];//WHY arr1[0]? YOU ARE GOING TO PUT AND OVERRIDE ALL THE ELEMENTS IN THE FIRST POSITION
    //arr1++;
    //x++;
    //}

    for(int i=0; i<array_size; ++i)
    {
        cout << "Enter your "<< i + 1 << ". number: ";
        cin >> arr1[i];//YOU HAVE TO PUT THE ELEMENT AT THE 'i' POSITION
    }

    //x=0;//YOU DON'T NEED ANYMORE THIS VARIABLE BECAUSE YOU SHOULD USE A FOR LOOP

    arr1=arr1_1;//WHAT EXACTLY IS THIS? THEY ARE ALREADY POINTING TO THE SAME MEMORY LOCATION
    //SO THIS ASSIGNMENT IS SUPERFLOUS

    cout << "\nHere's what you have inserted in the array: \n";

    //STILL: USE A FOR LOOP ;)
    //while(x<n)
    //{
    //  cout<<arr1[0]<<endl;;
    // arr1++;
    //x++;
    //}

    for(int i=0; i<array_size; ++i)//JUST 1 STATEMENT, YOU DON'T NEED PARENTHESIS
        cout << "Element number "<< i + 1 << " is: "<< arr1_1[i] << '\n';


    //arr1=arr1_1;

    cout<<"\n\n";
    cout<<"Do you want to extend the size of the array? \nAnswer with 'Y' or 'N'. "<<endl;
    char ans;
    cin >> ans;

    //int n1;//SUGGESTIVE NAMES HELP YOU TO READ THE CODE WHEN YOU WILL NEED TO DO IT
    int new_size;

    bool isSizeChanged = false;

    if(ans=='Y' || ans=='y')
    {
        isSizeChanged = true;//YOU WILL SEE AT THE END, 
         //WHEN YOU WANT TO FREE THE POINTERS, THAT THIS VARIABLE IS USEFUL

        cout<<"According to you, what should be the new size of array? ";
        cin >> new_size;

        if(new_size > 0)//YOU DON'T WANT TO MAKE arr1_1 INITIALIZE WITH 0 ELEMENTS
        {
            cout<<"You can enter new elements in your existing array now.\n";
        //YOU SHOULD PUT HERE THE CODE WHICH REALLOCATES MEMORY

        //Both arr1 and arr1_1 are pointing to the same memory location, 
        //but you can make 1 of them to point to another location!

            arr1_1 = new int[new_size];

            //COPYING THE ELEMENTS FROM arr1 TO arr1_1, 
            //WHICH NOW IS POINTING TO A DIFFERENT MEMORY LOCATION

            if(new_size >= array_size)//NOTE THAT IF THIS CONDITION IS TRUE, YOU WILL HAVE SOME LOCATIONS POINTED WITH RANDOM VALUES!!!
            {
                for(int i=0; i<array_size; ++i)
                    arr1_1[i] = arr1[i];
            }
            else//new_size is less than array_size
            {
                for(int i=0; i<new_size; ++i)//NOTE THAT NOW I AM USING new_size
                    arr1_1[i] = arr1[i];
            }

            cout << "\nYour new array contains:\n";

            for(int i=0; i<new_size; ++i)
                cout << "Element number "<< i +1 << ". is: "<<arr1_1[i] << '\n';

        }
        else
            cout << "Sorry, we cannot change the size of the pointer to 0 or less.\n";
    }
    else
        cout<<"Ok, then! Have a nice day.";

    //WHY ARE YOU DECLARING A NEW POINTERS?
    //YOU CAN USE 1 OF THE PREVIOUS POINTERS
    //int *arr2, *arr2_1;

    //YOU SHOULDN'T USE THE C STYLE TO REALLOCATE A POINTER, IT'S HARDER TO DO IT
    //arr2=(int *) realloc (arr1, n1*sizeof(int));

    //arr2_1=arr2;//OK, THIS WOULD HAVE WORKED :)
    //x=0;

    //I WOULD SUGGEST YOU TO USE A FOR LOOP ALSO IN THIS SITUATION
    //while(x<n)
    //{
    //arr2[0]=arr1[0];//YOU ARE COPYING THE FIRST ELEMENT OF arr1 TO THE FIRST ELEMENT OF arr2, ALWAYS!!
    //arr1++;
    //arr2++;
    //x++;
    //}

    /*
    x=n;
    while(x<n1)
    {
        cin>>arr2[n+1];
        arr2++;
        x++;
    }
    arr2=arr2_1;
    x=0;


    while(x<n1)
    {
        cout<<arr2[0]<<endl;
        arr2++;
        x++;
    }*/


    //FREEING THE MEMORY POINTED MY THE 2 POINTERS
    if(isSizeChanged)
    {
        delete [] arr1;
        delete [] arr1_1;
    }
    else
        delete [] arr1;//YOU JUST NEED TO DELETE OR arr1 or arr1_1 
         //BECAUSE THEY ARE STILL POINTING TO THE SAME MEMORY LOCATION

    return 0;
}
#包括
使用名称空间std;
int main()
{
//int n;//使用提示性名称调用变量
int数组的大小;
做
{
cout>数组大小;
}

虽然(数组大小可能会有助于您的问题发布预期输出和当前输出。可能会有助于您的问题发布预期输出和当前输出。首先,感谢您指出错误。我将纠正这些错误。很抱歉,我无法对您的答案投赞成票,因为我不知道答案。)el高于15。再次感谢。首先,感谢您指出错误。我会纠正这些错误。很抱歉,我无法更新您的答案,因为我的声誉级别不超过15。再次感谢。