Sichere Indizierung in unsicherem Code
-
28-10-2019 - |
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.
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.