Frage

Guten Morgen, Nachmittag oder Nacht,

Vorwort: Der folgende Code ist nicht wirklich nützlich.Es dient nur zu Erklärungszwecken.

Ist etwas falsch daran, ein Array "den abgesicherten Modus" in unsicherem Code zuzuweisen und zu verwenden?Zum Beispiel sollte ich meinen Code als schreiben

public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
    fixed (uint * first = firstParam, second = secondParam)
    {
        uint[] Result = new uint[firstParam.Length + secondParam.Length];

        for (int IndTmp = 0; IndTmp < firstParam.Length; Result[IndTmp] = *(first + IndTmp++));
        for (int IndTmp = 0; IndTmp < secondParam.Length; Result[IndTmp + firstParam.Length] = *(second + IndTmp++);

        return Result;
    }
}

oder sollte ich stattdessen eine separate, unsichere Methode schreiben, die nur Zeiger und Längen als Parameter akzeptiert und in der Hauptfunktion verwendet?

Gibt es auch eine Möglichkeit, die Zuordnung durch zu ersetzen?

uint * Result = stackalloc uint[firstParam.Length + secondParam.Length]

damit ich Result als Zeiger verwenden und trotzdem Result als uint[] zurückgeben kann?

Vielen Dank.

War es hilfreich?

Lösung

Ich sehe nichts Falsches daran, obwohl es wahrscheinlich sinnvoll ist, auch einen Zeiger in Result zu verwenden, wenn Sie Zeiger für die Geschwindigkeit verwenden.Vielleicht so:

public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
    uint[] Result = new uint[firstParam.Length + secondParam.Length];
    fixed (uint * first = firstParam, second = secondParam, res = Result)
    {
        for (int IndTmp = 0; IndTmp < firstParam.Length; IndTmp++)
            *(res + IndTmp) = *(first + IndTmp);
        res += firstParam.Length;
        for (int IndTmp = 0; IndTmp < secondParam.Length; IndTmp++)
            *(res + IndTmp) = *(second + IndTmp++);
    }
    return Result;
}

Geben Sie nichts zurück, was Sie stackalloc!Sobald die Funktion zurückkehrt, wird der auf dem Stapel zugewiesene Bereich wiederverwendet, wodurch Sie einen ungültigen Zeiger erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top