Есть несколько проблем, во-первых, нет необходимости типизировать результат malloc()
, как это неявно делается компилятором. Чтение Я разыграю результат malloc? .Это
int* intPtr = malloc(sizeof(int)); /* or even malloc(sizeof(*intPtr)); is better */
хорошо.
Во-вторых, это
*intPtr = &ab; /* *intPtr means value at allocated dynamic address, you should assign the value not address of ab*/
неверно, поскольку *intPtr
- это значение по динамическому адресу, компилятор должен был предупредить вас как
main.c: 7: 9: предупреждение: несовместимый указатель на целочисленное преобразование, присваивающий 'int
' из 'int *
'; удалить & [-Wint-преобразование]
Если вы скомпилировали следующие флаги, такие как
gcc -Wall -Wextra -Werror -Wpedantic test.c
Это должно быть
*intPtr = ab;
Также вы не освобождаете динамически выделяемую память, это приводит к утечке памяти.Освободите динамически выделенную память, позвонив по номеру free()
, как только использование будет завершено.
Примечание , если вы собираетесь сделать это
intPtr = &ab; /* Before this statement intPtr was pointing dynamic memory(heap), but now that gets overwritten with stack allocated space */
, тогда вы перезаписывает динамическую память созданной стеком памятью, то есть адресом локальной переменной , в этом случае вы теряете динамическую память, поскольку ничто не указывает на ранее выделенный динамический адрес.