Tworzenie tablicy za pomocą wskaźników w funkcji

0

Cześć
W celu przyspieszenia wykonywania operacji na tablicach, chciałem użyć wskaźników.
Przykładowo do tej pory tworzyłem tablicę w taki sposób:

public static int[,] CreateArr(int N)
{
    int[,] arr = new int[N, N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            arr[i, j] = i * j;
        }               
    }
    return arr;
}

A potem w innym miejscu:

int[,] array = CreateArray(3);

Co oczywiście daje następującą tablicę:

0 0 0
0 1 2
0 2 4

Chciałbym jednak skorzystać ze wskaźników. Robię więc coś takiego:

public static unsafe int* CreateArr2(int N)
{
    int* arr = stackalloc int[N * N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            *(arr + i * N + j) = i * j;
        }
    }
    return arr;
}

I potem:

int* arr = CreateArr2(3);

I tu niestety pojawia się problem, ponieważ otrzymuję "śmieci":

4 1638107264 31741676
88533484 88533400 1638454511
88533372 88533496 4597392

Jak można się z tym uporać?
Dodam jeszcze, że tworząc w ten drugi sposób tablicę bez udziału funkcji otrzymuję poprawne wyniki.

0

stackalloc działa tylko lokalnie, nie możesz zwrócić takiej tablicy z funkcji, bo przy return pamięć jest zwalniana.

to co chcesz osiągnąć zrobisz przez Marshal.AllocHGlobal i Marshal.FreeHGlobal.

W celu przyspieszenia wykonywania operacji na tablicach, chciałem użyć wskaźników.

To się robi inaczej. Deklarujesz zwykłą tablicę i przekazujesz ją normalnie, a w najbardziej newralgicznym miejscu pobierasz wskaźnik za pomocą fixed i operujesz na danych.

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