Naruszenie pamięci przy wskaźnikach

0

Cześć wszystkim. Mam funkcję, która podnosi do potęgi drugiej elementy w tablicy:

int *tabSquares(int *tab, size_t tSize)
{
    for(int i = 0; i < tSize; i++)
        tab[i] = tab[i]*tab[i];
    return tab;
}

następnie w main() próbuje tak:

int *tSquares = tabSquares(tab,3);

gdzie tab to: int tab[3] = {3,6,9}; Niestety przy odczytywaniu tSquares wyskakuje błąd naruszenia pamięci. Czyli jak sądzę ta linijka w main jest zła. Czy da się do wskaźnika jakoś przekazać adres tej tablicy, żebym mógł posługiwać się tym w tSquares ?

Drugi problem:
ponadto, utworzona wcześniej w main tablica ** int tab[3] = {3,6,9};** zmienia swoją zawartość po wywołaniu funkcji tabSquares;
czy istnieje jakiś inny sposób niż tworzenie nowej tablicy w funkcji tabSquares i skopiowanie do niej tablicy tab aby ta właśnie tablica tab nie zmieniła wartości w main ?

0
  1. Utworz stala tablice
  2. Pokaz reszte kodu (alokacje i wygibasy z ta tablica)
0

Oto cały kod:

#include <iostream>
using namespace std;

int *tabSquares(int *tab, size_t tSize)
{
    for(int i = 0; i < tSize; i++)
        tab[i] = tab[i]*tab[i];
    return tab;
}

int main()
{
    int tabs[3] = {3,6,9};
    int *tSquares = tabSquares(tabs, 3);
    for(int i = 0; i < 3; i++)
        cout << tSquares[i] << " ";
    delete [] tSquares;
    return 0;
}
0

@fasadin juz dal odpowiedz, ale pozwole sobie zacytowac, ze wzgledu na to, ze umiescil ja w komentarzu.

delete używasz gdy używasz operatora new. Tutaj tego nie ma. Po co zwracać wskaźnik który jest argumentem? Po prostu modyfikuj co jest pod wskaźnikiem i nadal korzystaj z tabs

A tu kod, ktory sie nie crashuje:

#include <iostream>
using namespace std;
 
int *tabSquares(int *tab, size_t tSize)
{
    for(int i = 0; i < tSize; i++)
        tab[i] = tab[i]*tab[i];
    return tab;
}
 
int main()
{
    int tabs[3] = {3,6,9};
    int *tSquares = tabSquares(tabs, 3);
    for(int i = 0; i < 3; i++)
        cout << tSquares[i] << " ";
    return 0;
}
0

Jest dużo sposobów ale poniżej masz kilka najczęściej stosowanych:

#include <iostream>
#include <vector>
using namespace std;
 
void tabSquares1(int *tab,int *ret,size_t size)
  {
   for(int i=0;i<size;++i) ret[i]=tab[i]*tab[i];
  }
 
vector<int> tabSquares2(int *tab,size_t size)
  {
   vector<int> ret(size);
   for(int i=0;i<size;++i) ret[i]=tab[i]*tab[i];
   return ret;
  }
 
int *tabSquares3(int *tab,size_t size)
  {
   int *ret=new int[size];
   for(int i=0;i<size;++i) ret[i]=tab[i]*tab[i];
   return ret;
  }
 
void tabSquares4(int *tab,size_t size)
  {
   for(int i=0;i<size;++i) tab[i]=tab[i]*tab[i];
  }
 
int main()
  {
   int tabs[3]={3,6,9},tabr[3];


   tabSquares1(tabs,tabr,3);
   for(int i=0;i<3;++i) cout<<tabr[i]<<" ";
   cout<<endl;

   vectro<int> sqr=tabSquares2(tabs,3);
   for(int i=0;i<3;++i) cout<<sqr[i]<<" ";
   cout<<endl;

   int *sqt=tabSquares2(tabs,3);
   for(int i=0;i<3;++i) cout<<sqt[i]<<" ";
   delete[] sqt;
   cout<<endl;

   tabSquares4(tabs,3);
   for(int i=0;i<3;++i) cout<<tabs[i]<<" ";
   cout<<endl;

   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1