Does the above code invoke Undefined Behavior?
Kommt drauf an.
Von C11 Entwurf 6.3.2.3/7:
A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned) for the referenced type, the behavior is undefined.
Als Ausrichtung für ein char
könnte von einem int
anders sein, das ist wahrscheinlich weniger restriktiv, einen char * pc
zu einem int * pi
zuweisen könnte zu pi
Wesen führen verstellt.
jedoch für das spezifische Beispiel durch das OP gegeben:
char * pc = malloc(64);
int * pi = pc;
das Verhalten würde definiert werden, wie (Siehe Alter Mann ‚s comment) malloc()
garantiert einen Speicherblock zurück richtig ausgerichtet .
Von C11 Entwurf 7.22.3:
The pointer returned [by aligned_alloc, calloc, malloc, and realloc] if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement ...
Ein Beispiel, das würde führen zu undefinierten Verhalten, aufgrund einer Fehlausrichtung ist:
char * pc = malloc(64);
int * pi = pc + 1;
Does the above code snippet free the memory allocated by malloc for str?
Bei die frühere Zuordnung hätte undefiniertes Verhalten eingeführt, ist diese Frage irrelevant vant, da alles passieren könnte, weil UB bereits aufgerufen wurde.
Wenn sonst die vorherige Zuordnung nicht UB aufgerufen hat, würde der Aufruf von free()
perfekt de-Zuweisung des Speicherblockes referenziert, als Umwandlung des Zeigerwertes int *
-void *
zurück, wie ursprünglich von malloc()
vorgesehen ist, gut ist definiert.
Von C11 Entwurf 6.3.2.3/7 (Forts /):
Otherwise, when converted back again, the result shall compare equal to the original pointer
und
Von C11 Entwurf 6.3.2.3/1:
A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer
Welchen Compiler benutzen Sie? Der obige Code gibt 'error: kann 'char *' in 'int *' bei der Initialisierung mit gcc 4.9.2 nicht konvertieren. – farukdgn
Ich dachte daran, diese Frage nach dieser einen Frage gestern ebenfalls zu stellen. Danke für das Nachschlagen ... :-) – alk
@farukdgn, Habe diesen Fehler beim Kompilieren mit g ++ in C++ bekommen. GCC scheint es zu kompilieren. Ich benutze GCC 4.8.1. –