Loading...
tsvetanpopharitov avatar tsvetanpopharitov 1 Точки

Защо пойнтъра от функцията дава други числа тук.

#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;
}

Тагове:
0
C++ Programming
zzerro avatar zzerro 16 Точки
Best Answer

Промени създаването на масива във функцията да изглежда така:

int * intArr = new int [100];

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Само едно уточнение към отговора на колегата:

int intArr[100]; заделя масивът локално за функцията getNumbers(), като част от "автоматичната памет". Това означава, че паметта за него ще бъде освободена в момента, в който функцията приключи. Когато return-неш pointer към тази памет, тя вече не е твоя и нямаш никакви гаранции какво има в нея - имаш ѝ адресът, но съдържанието вече не е твое. Все едно да си хванеш такси - знаеш му номерът, ама след като слезеш от него не можеш просто да се качиш отново всеки път като го видиш на улицата, все едно си е твое, защото в него може да има друг човек, който пътува нанякъде.

Това с new, което колегата ти предлага, е верния подход, защото така заделяш памет "ръчно" (dynamic memory му се вика в C++). Тази ръчно-заделена памет не се освобождава, когато излезе функцията - тя си стои заделена и нищо не я бута, докато ти изрично не кажеш да бъде освободена. Затова, когато върнеш pointer към нея, можеш да разчиташ, че там ще пише това, което ти си записал - защото тя няма да бъде предостъпена на някоя друга програма, освен ако ти изрично (ръчно) не кажеш това да се случи. И начинът да го кажеш е с delete[] - това трябва и да ползваш в твоята програма, в случая след края на for цикъла, за да кажеш на системата, че нямаш вече нужда от тази памет. Тук е като да си купиш кола - можеш да си влизаш в нея, можеш да я даваш на приятелите си и т.н., но тя си е твоя, знаеш ѝ регистрационния номер и ѝ имаш талона - докато изрично не кажеш, че няма да я ползваш и не я продадеш на някого, можеш винаги да си я вземаш и да се качваш в нея.

Btw, решението и така не е напълно вярно - откъде знаеш, че масивът няма да е по-голям от 100 елемента? А от 1000? И после в main откъде знаеш колко голям се е оказал масивът - представи си, че се въвежда от конзолата, тогава до кой елемент ще изпечаташ?

Поздрави,

Жоро

1
y.ivanov avatar y.ivanov 33 Точки

Привет,

Най-вероятното обяснение е, че създаваш масива от числа в стека. Пробвай да го създадеш в heap.

Поздрави

Ясен

 

PS: Програмата работи коректно. Не е необходимо да я коригираш.

0
29/03/2017 09:30:29
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.