Общий вопрос относительно выделения памяти для целого числа в C - PullRequest
0 голосов
/ 28 мая 2019

В настоящее время я изучаю динамическое распределение памяти в C и испытываю трудности с определенной концепцией. Для использования malloc для определенного целого числа мне нужно поместить ранее объявленное целое число в этом пространстве.

Ниже приведено то, что я добавляю в качестве кода.

void example(int ab)
{
int* intPtr=(int*)malloc(sizeof(int));
*intPtr = &ab;
}

Я не пытаюсь запустить программу или что-то еще. Я просто хочу посмотреть, правильно ли я понимаю некоторые основные распределения памяти.

1 Ответ

0 голосов
/ 28 мая 2019

Есть несколько проблем, во-первых, нет необходимости типизировать результат 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 */

, тогда вы перезаписывает динамическую память созданной стеком памятью, то есть адресом локальной переменной , в этом случае вы теряете динамическую память, поскольку ничто не указывает на ранее выделенный динамический адрес.

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