2016-05-05 9 views
0

Wenn ich dynamisch Speicher in C mit einer Funktion der malloc Familie zuweisen, gibt es eine Regel (aus dem C-Standard oder die inneren Abläufe eines Betriebssystems), was der Anfangswert von diese Erinnerung ist?Was ist der Anfangswert des dynamischen Speichers

+4

Nein. 'Calloc'? Ja. – user3386109

+2

hängt davon ab. Wäre nicht davon abhängig. Sie können immer 'calloc' verwenden. http://stackoverflow.com/questions/1538420/difference-between-malloc-and-calloc –

+0

@MikeCAT: Soweit ich sagen kann, ist die Verwendung des Ergebnisses von 'malloc()' ohne Initialisierung nur undefiniertes Verhalten auf Systemen, die Verwenden Sie "Trap-Repräsentationen", die, wenn die involvierten Typen wie in der Frage hier integriert sind, grundsätzlich in keinem realen System vorkommen. Obwohl es auf einem hypothetischen Computer technisch undefiniert sein kann, glaube ich nicht, dass in dieser Frage das Risiko einer echten UB im Code besteht. Es ist immer noch nutzloser Code. –

Antwort

5

Der Anfangswert des dynamisch zugewiesenen Speichers ist unbestimmt, was den C-Standard betrifft. Einige Plattformen können Ihnen Nullen geben, andere können Ihnen Schutzwerte wie 0xEE geben, aber in einem portablen C-Programm ist nichts davon sicher.

Wenn Sie Nullen benötigen, verwenden Sie am häufigsten die calloc(), die auf einigen Plattformen optimiert werden kann.

+0

Das Problem mit "Calloc" ist, dass Nullen der Speicher ist, aber garantiert nicht z. um ein Array von Zeigern auf _null pointer_ zu setzen, wenn der Wert _null pointer_ ebenfalls nicht Null ist. Also das ist auch nicht tragbar. Das gleiche für Gleitkomma und komplex. – Olaf

+0

@Olaf: Für float und double garantiert C99, dass 'calloc()' 0.0-Werte erzeugt, wenn '__STDC_IEC_559__' definiert ist, auch wenn das System IEEE 754 verwendet. Es ist daher einfach, eine Kompilierungszeit dafür hinzuzufügen, und Es ist sehr wahrscheinlich, dass es jedes System weitergibt, das hier benutzt wird. Also nicht theoretisch tragbar, aber trotzdem möglich, die Korrektheit zu gewährleisten. –

+0

Nein, nicht jedes System verwendet IEEE754 Fließkommazahl. Tatsächlich wird es von einer großen Anzahl von Systemen nicht oder nur teilweise implementiert. Aber ich stimme zu, dass die meisten dieser Systeme auch "All-Zero" für "0.0" verwenden. Sie vergessen eingebettete Systeme und DSPs. Aber Floats waren nicht das einzige Problem, und für einen Zeiger ist es komplizierter, einen Check zu haben, weil jede Umwandlung von '0' in einen Zeiger per Definition mit 'NULL' übereinstimmen muss. Jedenfalls war keiner der Punkt. Ich war explizit nach Portabilität, die du auch erwähnt hast, was bei 'calloc' eigentlich auch nicht garantiert ist. Es ist etwas, das man beachten muss. – Olaf