Этот фрагмент кода не рекомендуется или неправильно, и почему - PullRequest
1 голос
/ 08 марта 2020
#include <stdio.h>
#include <stdlib.h>
int main() {
    const int N = 20;
    char* ptr0 = (char*)malloc(sizeof(char*)*N);
    *(char**)(ptr0) = ptr0; //is this line ok?
    free(ptr0);

    return 0;
}

Мне просто интересно, что шестая строка кода, *(char**)(ptr0) = ptr0, вызовет cra sh или неверный результат, поэтому не рекомендуется писать это, или это просто нормально?

1 Ответ

3 голосов
/ 08 марта 2020

Да, это на 100% безопасно. Выравнивание в порядке, так как результат mallo c всегда выровнен. Таким образом, вы просто сохраните указатель в начале неправильно выделенной памяти.

Он также не нарушает правило строгого алиасинга

https://godbolt.org/z/p_8jrP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...