указатели — Как вернуть структуру из функции в переполнении стека

Поэтому я тщательно изучил темы, выполнив поиск по этому сайту, но не смог найти то, что могло бы мне помочь.

Я делаю задание для своего друга и позвольте мне сказать вам, что прошел год или больше с тех пор, как я использовал C ++.

Поэтому проблема, с которой я сталкиваюсь, связана с указателями и возвращением структуры через указатель.

Вот код ниже:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

struct student
{
int SUB[3];
};

struct AVGPCT
{
float avg;
float pct;
};AVGPCT* CALC(student *A)
{
int x,y;
AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};

for(x=0;x<5;x++)
{
for(y=0;y<3;y++)
{
D[x].avg+=A[x].SUB[y];
D[x].pct+=A[x].SUB[y];
}
}

for(x=0;x<5;x++)
{
D[x].avg/=2;
D[x].pct/=300;
}
return (D);
}

void main(void)
{
int i,j;
student S[5];
AVGPCT *V;

for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
cout << "Enter Marks Of Subject[" << (j+1) << "] Of Student [" << (i+1) <<"] [Max=100]:";
cin >> S[i].SUB[j];
}
}

V = CALC(S);
cout << "Average Number Of Student [1]: " << V->avg;
cout << (*V).pct;

getch();
}

Теперь проблема в том, что мне трудно получить правильные значения из этого места.

Я пытаюсь увеличить указатель с помощью V ++. Самое смешное, что это правильно печатает значения, если я использую:

cout << V->avg;
cout << V->pct;
V++;
cout << V->avg;
cout << V->pct;

И так далее. Но если я использую цикл или записываю хотя бы одну строку, или использую endl или \ n, значения перемешиваются и появляются бессмысленные значения.

Так что здесь может пойти не так?

Важно, что я использую структуру, а также, пожалуйста, руководство в соответствии с кодом.

0

Решение

Выглядит как эта строка

AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};

объявляет массив D локально для функции CALC()

Вы передаете указатель на этот массив обратно в основную функцию, но массив помечается как бесплатная игра для перезаписи после завершения функции. Чем больше вещей вы делаете в программе, тем больше вероятность того, что это место в памяти будет перезаписано, хотя трудно сказать, когда это произойдет. Следовательно, иногда вам это сходит с рук, иногда нет.

С риском дать вам совет, вероятно, лучше объявить D где-то в главном и передать указатель на него в функцию или использовать new или же malloc внутри функции и передайте результирующий указатель обратно.

2

Другие решения

Возврат указателя на данные в стеке не работает. Использовать std:vector<AVGPCT> вместо этого и вернуть его по значению, а не по указателю. C ++, в отличие от Java или C #, основан на значениях, а не на указателях.

C ++ не позволяет возвращать void от main(),

Заголовок <iostream.h> не существует в соответствии со стандартом C ++. Стандартный заголовок <iostream>,

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector