Защо пойнтъра от функцията дава други числа тук.
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class LineParser{
string str="";
public:
LineParser(const string& str){
this->str=str;
}
int* getNumbers()const{
int intArr[100];
istringstream iString(this->str);
int a;
int counter=0;
while(iString>>a){
intArr[counter++]=a;
}
int * arrPnt=intArr;
for(int i=0;i<4;i++){
cout<<intArr[i]<<" ";
}
cout<<endl;
return intArr;
}
};int main(){
string test1="1 3 5 14";
LineParser lP(test1);
int intArr[100];
int*arrPnt=lP.getNumbers();
for(int i=0;i<4;i++){
cout<<arrPnt[i]<<" ";
}return 0;
}
Само едно уточнение към отговора на колегата:
int intArr[100]; заделя масивът локално за функцията getNumbers(), като част от "автоматичната памет". Това означава, че паметта за него ще бъде освободена в момента, в който функцията приключи. Когато return-неш pointer към тази памет, тя вече не е твоя и нямаш никакви гаранции какво има в нея - имаш ѝ адресът, но съдържанието вече не е твое. Все едно да си хванеш такси - знаеш му номерът, ама след като слезеш от него не можеш просто да се качиш отново всеки път като го видиш на улицата, все едно си е твое, защото в него може да има друг човек, който пътува нанякъде.
Това с new, което колегата ти предлага, е верния подход, защото така заделяш памет "ръчно" (dynamic memory му се вика в C++). Тази ръчно-заделена памет не се освобождава, когато излезе функцията - тя си стои заделена и нищо не я бута, докато ти изрично не кажеш да бъде освободена. Затова, когато върнеш pointer към нея, можеш да разчиташ, че там ще пише това, което ти си записал - защото тя няма да бъде предостъпена на някоя друга програма, освен ако ти изрично (ръчно) не кажеш това да се случи. И начинът да го кажеш е с delete[] - това трябва и да ползваш в твоята програма, в случая след края на for цикъла, за да кажеш на системата, че нямаш вече нужда от тази памет. Тук е като да си купиш кола - можеш да си влизаш в нея, можеш да я даваш на приятелите си и т.н., но тя си е твоя, знаеш ѝ регистрационния номер и ѝ имаш талона - докато изрично не кажеш, че няма да я ползваш и не я продадеш на някого, можеш винаги да си я вземаш и да се качваш в нея.
Btw, решението и така не е напълно вярно - откъде знаеш, че масивът няма да е по-голям от 100 елемента? А от 1000? И после в main откъде знаеш колко голям се е оказал масивът - представи си, че се въвежда от конзолата, тогава до кой елемент ще изпечаташ?
Поздрави,
Жоро