Gibt es einen Unterschied zwischen Null und 0 bei der Zuordnung zu Zeigern in unsicheren Code?

8

Das mag seltsam erscheinen, aber in C (size_t) (void *) ist 0 == 0 durch die Sprachspezifikation nicht garantiert. Compiler dürfen jeden beliebigen Wert für null verwenden (obwohl sie fast immer 0 verwenden).

In C # können Sie einem Zeiger in unsicheren Code null oder (T *) 0 zuweisen.

  1. Gibt es einen Unterschied?
  2. (lang) (void *) 0 == 0 (garantiert oder nicht? Anders ausgedrückt: IntPtr.Zero.ToInt64 () == 0)

MSDN hat dies zu IntPtr.Zero zu sagen:

"Der Wert dieses Feldes entspricht nicht null." Nun, wenn Sie mit C-Code kompatibel sein wollen, macht das sehr viel Sinn - es wäre für Interop wertlos, wenn es nicht in einen C-Null-Zeiger umgewandelt würde. Aber ich möchte wissen, ob IntPtr.Zero.ToInt64 () == 0 was möglich ist, auch wenn intern IntPtr.Zero ein anderer Wert ist (die CLR kann Null in der Cast-Operation konvertieren oder nicht)

Kein Duplikat von diese Frage

    
Eloff 05.05.2010, 00:24
quelle

2 Antworten

5

Sie könnten das Problem vermeiden:

%Vor%

Sie sind also gleich, aber die Verwendung von default vermeidet das Einbetten beliebiger Annahmen oder hässlicher Umwandlungen in den Code. Der obige Unterschied besteht darin, dass der Unterschied nur signiert / vorzeichenlos ist - beide beginnen mit einer 4-Byte-Konstante ( i4 / u4 ) und werden dann in native-int ( i / u ) umgewandelt (die Kommentare // ) sind meine):

%Vor%     
Marc Gravell 05.05.2010, 04:27
quelle
0

In% C ist NULL als architekturspezifisch definiert. Während die meisten Architekturen 0 verwenden, tun einige nicht. Sie können also nicht annehmen, dass NULL == 0 in C.

ist

Nicht ganz sicher, wie es in C # funktioniert, obwohl ich empfehlen würde, dass Sie sich an die Standardmethode halten, NULL in C # anzugeben, anstatt sie auf 0 zu setzen.

    
sybreon 05.05.2010 01:05
quelle

Tags und Links