Wenn ein Objekt eine automatische Speicherdauer hat und seine Adresse nicht verwendet wird, führt der Versuch, es zu lesen, zu einem undefinierten Verhalten. Wenn die Adresse eines solchen Objekts verwendet wird und Zeiger vom Typ "vorzeichenloses Zeichen" zum Auslesen der Bytes verwendet werden, wird vom Standard garantiert, dass ein Wert vom Typ "vorzeichenloses Zeichen" erhalten wird, aber nicht alle Compiler halten sich in dieser Hinsicht an den Standard . ARM GCC 5.1, zum Beispiel, wenn angegeben:
#include <stdint.h>
#include <string.h>
struct q { uint16_t x,y; };
volatile uint16_t zz;
int32_t foo(uint32_t x, uint32_t y)
{
struct q temp1,temp2;
temp1.x = 3;
if (y & 1)
temp1.y = zz;
memmove(&temp2,&temp1,sizeof temp1);
return temp2.y;
}
generiert Code, der x zurückgibt, wenn y Null ist, auch wenn x außerhalb des Bereichs 0-65535 liegt. Der Standard macht deutlich, dass vorzeichenlose Zeichenlesevorgänge mit unbestimmtem Wert garantiert einen Wert im Bereich von ergeben unsigned char
und das Verhalten von memmove
als einer Folge von Zeichenlese- und -schreibvorgängen äquivalent definiert ist. Daher sollte temp2 einen Wert haben, der über eine Folge von Zeichenschreibvorgängen darin gespeichert werden könnte, aber gcc beschließt, den memmove durch eine Zuweisung zu ersetzen und die Tatsache zu ignorieren, dass der Code die Adresse von temp1 und temp2 angenommen hat.
Es wäre hilfreich, ein Mittel zu haben, um einen Compiler zu zwingen, eine Variable als einen beliebigen Wert seines Typs zu betrachten, wenn ein solcher Wert gleichermaßen akzeptabel wäre, aber der Standard gibt kein sauberes Mittel dafür an (speichern) zum Speichern eines bestimmten Wertes, der funktionieren würde, aber oft unnötig langsam ist). Selbst Operationen, die eine Variable logisch zwingen sollten, einen Wert zu halten, der als eine Kombination von Bits darstellbar wäre, können nicht für alle Compiler verwendet werden. Folglich kann für solche Variablen nichts Nützliches garantiert werden.
a
den dort befindlichen Müll zuweisen und anschließend daraus lesen würde . Wenn nicht, ist das Verhalten undefiniert.