C++ Returning Array, data loss [duplicate]

醉酒当歌 提交于 2021-02-05 11:01:07

问题


I'm new to C++ coming from Java so forgive me for being naive, but I'm trying to pass an array out of a function. I know the way to do this is to pass a pointer, like so:

int *foo(){
   int arr[3] = {1, 2, 3};
   int *arrptr = arr;
   return arrptr;
}

And then to access that array:

int main(){
   int *arrptr = foo();  //create a pointer to array

   //cout all elements
   for(int x = 0; x < 3; x++)
      cout << arrptr[x];

   return 0;
}

And naturally, this works just fine. But for some reason in a different code, this same process only returns the first value of the array and the rest seem to be random.

int main(){
   stringstream allstats;
   allstats << readFile(); //readFile() simply returns a string read from a file

   while(!allstats.eof()){     //check for end of stream
      string temp;             
      getline(allstats, temp); //grab a line from allstats and put it into temp

      double *arr = calculateStats(temp); //create pointer to array of stats calculated for temp

      // print arr
      for(int x = 0; x < 6; x++)
         cout << arr[x] << endl;
      //****This spits out the correct value for arr[0] but for the rest of the array
      //****it is values like 8.58079e-306 which tells me those addresses have been
      //****overwritten.

   }
   return 0;
}

//calculate stats for each player, return as formatted string
double* calculateStats(string player){
   //cut for conciseness, just know it works and the proper values are in the following array

   //create stat array
   double statarr[6] = {(double)BA, (double)OB, (double)H, (double)BB, (double)K, (double)HBP};

   //create pointer to stat array
   double *ptr;
   ptr = statarr;

   return ptr;
}

In Java it would be as simple as just returning an array and the job is done. Is this even possible in C++ or is this just beyond my level of understanding and the solution is much more complicated than I thought?


回答1:


You cannot have pointer references to local arrays in external functions, since once the local function exits it's stack may be reused and the data in the local variables will contain trash.

You can add word static to your local arrays declaration for it's memory to be persistent across other functions (and repeated calls). Although that is not a recommended solution at all here.

Change:

double statarr[6] = {(double)BA, (double)OB, (double)H, (double)BB, (double)K, (double)HBP};

To:

static double statarr[6] = {(double)BA, (double)OB, (double)H, (double)BB, (double)K, (double)HBP};

Although, a better solution would be to not declare the array local to calculateStats

Something like:

    //calculate stats for each player, return as formatted string
double* calculateStats(string player, double *outArr){
   //cut for conciseness, just know it works and the proper values are in the following array

   //create stat array
   outArr[0] = (double)BA;
   outArr[1] = (double)OB;
   outArr[2] = (double)H;
   outArr[3] = (double)BB;
   outArr[4] = (double)K;
   outArr[5] = (double)HBP;


   return outArr;
}

Then have:

int main(){
   stringstream allstats;
   allstats << readFile(); //readFile() simply returns a string read from a file

   while(!allstats.eof()){     //check for end of stream
      string temp;             
      getline(allstats, temp); //grab a line from allstats and put it into temp

      double arr[6]
      calculateStats(temp, arr) //create pointer to array of stats calculated for temp

      // print arr
      for(int x = 0; x < 6; x++)
         cout << arr[x] << endl;
      //****This spits out the correct value for arr[0] but for the rest of the array
      //****it is values like 8.58079e-306 which tells me those addresses have been
      //****overwritten.

   }
   return 0;
}


来源:https://stackoverflow.com/questions/46203092/c-returning-array-data-loss

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!