История изменений
Исправление monk, (текущая версия) :
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main() {
int *p = (int*)malloc(sizeof(int));
intptr_t c1 = (intptr_t)p;
int *k = (int*)realloc(p, sizeof(int));
intptr_t c2 = (intptr_t)k;
*k = 2;
if (c1 == c2) {
*(int *)c1 = 1;
printf("%d %d\n", *(int *)c1, *(int *)c2);
}
}
Выводит 1 2
на clang. Хотя тут формально даже UB нет: к p я после realloc не обращаюсь, по адресу из c1 пишу после того, как убедился, что он указывает на k (равен c2).
Исходная версия monk, :
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main() {
int *p = (int*)malloc(sizeof(int));
intptr_t c1 = (intptr_t)p;
int *k = (int*)realloc(p, sizeof(int));
intptr_t c2 = (intptr_t)k;
*k = 2;
if (c1 == c2) {
*(int *)c1 = 1;
printf("%d %d\n", *(int *)c1, *(int *)c2);
}
}
Выводит 1 2
на clang. Хотя тут формально даже UB нет: к p я после realloc не обращаюсь, по адресу из c1 пишу после того, как убедился, что он указывает на k.