Wie setze ich eine fixierte Array auf NULL

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Wie setze ich eine fixierte Array auf NULL

    Guten Morgen Community

    Ich möchte gerne, über einen Pointer die darunter liegende fixed Array auf null setzen. Ist das in C#
    überhaupt möglich, denn immerhin ist die Array ja fixed.

    Danke für die Antworten.

    Freundliche Grüsse

    exc-jdbi

    C#-Quellcode

    1. //Nehmen wir an folgende Situation entsteht
    2. ​static unsafe void Methode1()
    3. {
    4. var array = new int[0];
    5. fixed (int* parray = array)
    6. Methode2(parray, array.Length);
    7. //Jetzt sollte die array auf null sein
    8. }
    9. static unsafe void Methode2(int* parray, int size)
    10. {
    11. if (parray != null && size > 0)
    12. {
    13. //Irgend ein Code
    14. //Nehmen wir an, es wird nicht durchlaufen
    15. }
    16. //Wie setze ich die "array(!)" auf null
    17. parray = null;//Funkst nicht
    18. }
    @exc-jdbi So was:

    C#-Quellcode

    1. Array.Clear(array, 0, array.Length);
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nicht ganz.

    Vielleicht lässt sich das mit C++ leichter erklären. Hier das gleiche in C++.

    C-Quellcode

    1. void Methode2(int* parray, int size)
    2. {
    3. if (parray != NULL && size > 0)
    4. {
    5. //Irgend ein Code
    6. //Nehmen wir an, es wird nicht durchlaufem
    7. return;
    8. }
    9. //Ist zwar nicht C++-Style, aber
    10. //der Effekt ist der gleiche
    11. delete[] parray;
    12. parray = NULL;
    13. }
    14. void Methode1()
    15. {
    16. int size = 0;
    17. int *array = NULL;
    18. array = new int[size + 1];
    19. memset(array, 0, size + 1 * sizeof(int));
    20. Methode2(array, size);
    21. //In diesem Falle gilt array == NULL
    22. if (array)
    23. {
    24. //und weiter gehts
    25. getchar();
    26. }
    27. }

    exc-jdbi schrieb:

    Nicht ganz.

    C#-Quellcode

    1. array = null;
    Ansonsten mach schreib mal den Inhalt der Variable vor und nach Deinem gewünschten Modifizieren als Werte auf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das 0 setzen in dem C++ Snippet bringt nichts. Der Zeiger in Methode1 bleibt unverändert. Beim Aufruf von Methode2 wird der Zeiger kopiert. Alle Änderungen wie +, -, = wirken sich nur auf die Kopie aus. Delete[] löscht dir allerdings den Speicher, was den Zeiger in Methode1 auf Speicher zeigen lässt der bereits freigegeben wurde -> sehr suboptimal. Entweder du übergibst einen int** oder du gibst den Speicher da frei wo er mit new erzeugt wurde.

    In C# hat sich das sowieso erledigt. Wenn du ein Array anpinnst, dann zeigt der Zeiger immer auf eine gültige Adresse und muss nicht auf 0 gesetzt werden. Das Array räumst du nämlich nicht auf sondern der GC. Der macht's frühestens wenn das Array abgepinnt wurde, seine Gültigkeit verloren hat oder auf null gesetzt wurde.
    Bei mir klappt es aber nur wenn du das Array > 0 initialisierst. Sonst ist parray nähmlich schon von Anfang an 0.

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. Console.WriteLine("Hello World!");
    4. Methode1();
    5. }
    6. static void Methode1()
    7. {
    8. var array = new int[5];
    9. fixed (int* parray = array)
    10. Methode2(parray, array.Length);
    11. }
    12. static unsafe void Methode2(int* parray, int size)
    13. {
    14. if (parray != null && size > 0)
    15. {
    16. //Irgend ein Code
    17. //Nehmen wir an, es wird nicht durchlaufen
    18. }
    19. //Wie setze ich die "array(!)" auf null
    20. parray = null;//Funkst nicht
    21. }
    Danke für die Antworten

    Ich hab es jetzt anders gemacht. Schlussendlich geht es nur darum ein Feedback aus der Methode zu bekommen, damit korrekt weiter gearbeitet werden kann.

    C#-Quellcode

    1. ​static unsafe bool Methode4<T>(T* parray, int size) where T : unmanaged
    2. {
    3. if (parray != null && size > 0)
    4. {
    5. //Irgend ein Code
    6. //Nehmen wir an, es wird nicht durchlaufem
    7. return true;
    8. }
    9. return false;
    10. }


    Freundliche Grüsse

    exc-jdbi
    jo - das wäre auch fragwürdiges Design, wenn die aufgerufene Methode das Argument ändert, sodass es beim Aufrufer ein anderes ist als vorher. Für sowas gibts ref, aber man versucht es zu vermeiden - lieber Rückgabewerte.
    Du könntest auch das Array zurückgeben, oder ein Array - oder null.
    Ein Array zu übergeben oder zu returnen ist ja auch nur ein Pointer.

    Aber wenn nur angezeigt werden soll, ob das Array durchlaufen wurde, ist ein bool glaub am klarsten.