0

関数で配列構造体へのポインターを逆参照し、関数内で出力しています。これは正しく機能しますが、関数からポインターを返すとすぐに、正しく印刷されません。同様の質問について調査を行いましたが、正確な問題を見つけることができないようです。

正しい印刷: 11 5 1 2 3 4 5 10 20 30 40 間違った印刷: 11 5 1 2 5024 96 0 0 20 30 40

(問題箇所はCAPSでコメントしています)

[arraytools.cpp]

#include "arraytools.h"
#include <iostream>

using namespace std;

void DisplayArray (short int* a)
{
    short int size = a[0];
    int i;
    for (i=0; i<size; i++)
    {
        cout<< a[i] << " ";
    }
    cout<<endl;
}

short int* ConcatArray (short int* a1, short int* a2)
{
    short int size = a1[0] + a2[0] + 1;  //size of newarray
    short int *ptr;          //pointer for newarray
    short int newarray[size];  //initializing new array with given new size
    newarray[0] = size;    //making first object in new array the size of it

    int i,j;    
    for (i=0; i<a1[0]; i++)  //loop to store first array objects to newarray
    {
        newarray[i+1] = a1[i];
    }

    int lastpoint = a1[0] + 1;  //marks the point to start adding the second array to newarray
    for (j=0; j<a2[0]; j++)  //loop to store second array objects to newarray
    {
        newarray[lastpoint] = a2[j];
        lastpoint++;

    }

    ptr = &newarray[0];  //assigning new array to pointer
    DisplayArray(ptr);  //PRINTS CORRECTLY HERE
    return ptr;
}

[main.cpp]

#include "arraytools.h"
#include <iostream>
using namespace std;

int main()
{
    char choice = 'y';  //user defined later in program
    while (choice == 'y') // for repeating process
    {
        //declaring two arrays of short int
        short int arr1[] = {5,1,2,3,4};
        short int arr2[] = {5, 10, 20, 30, 40};

        //pointers to refer to declared arrays
        short int* nptr, *ar1, *ar2;

        ar1 =arr1;
        ar2 =arr2;

        DisplayArray(ar1);
        DisplayArray(ar2);

        nptr = ConcatArray(ar1, ar2); //RECIEVES RETURNED POINTER
        DisplayArray(nptr);  //PRINTS INCORRECTLY

        cout<<"Run process again? y/n: "; //loop exit condition
    cin >> choice;
    }
   return 0;
}
4

4 に答える 4

4

newarrayを「スタック上」に割り当てています。スコープ外になると(つまり、関数が終了すると)、再利用されます。本当にこれを実行したい場合は、mallocを使用してください。または、実際にC ++を使用している場合は、std::vectorなどのより優れたコンテナーを検討してください。

ConcatArray (short int* a1, short int* a2)
{
    short int size = a1[0] + a2[0] + 1;  //size of newarray
    short int *ptr;          //pointer for newarray
    short int newarray[size];  //initializing new array with given new size
于 2013-02-07T20:48:44.583 に答える
4

この行は問題の根源です:

short int newarray[size];

スタックに配列を割り当て、その関数から戻るとすぐに無効になりますが、そのアドレスを返します。これを試して:

short *newarray = new short [size];

今、それはヒープに行きます。もちろん、印刷後のメインのように、不要になった場合は delete[] 演算子で削除する必要があります。

delete[] nptr;
于 2013-02-07T20:53:47.863 に答える
2

新しい配列を関数のローカル変数として配置すると、(通常は)スタックに割り当てられます。次に、呼び出し元のコードへのポインタを返します。ただし、メソッドが戻ると、メモリは解放されます。したがって、呼び出された関数が戻ると、ポインタは未定義のメモリ領域を指します。

于 2013-02-07T20:48:49.747 に答える
1

関数は、スタックに格納されているローカル変数へのポインターを返します。データにはmallocメモリが必要です。

于 2013-02-07T20:49:20.740 に答える