首页 > 解决方案 > 关于在 C 中为整数分配内存的一般问题

问题描述

我目前正在学习 C 中的动态内存分配,并且对特定概念有困难。为了将 malloc 用于特定整数,我需要在该空间内放置一个先前声明的整数。

以下是我作为代码放入的内容。

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

我不是想运行程序或任何东西。我只是想看看我是否对一些基本的内存分配有正确的想法。

标签: cmemorymalloc

解决方案


几乎没有问题,首先不需要对结果进行类型转换,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的,编译器应该警告你喜欢

intmain.c:7:9: 警告:从 ' '分配给 '' 的整数转换指针不兼容int *删除 & [-Wint-conversion]

如果您使用以下标志编译,例如

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 */

然后您将使用堆栈创建的内存(即局部变量的地址)覆盖动态内存,在这种情况下,您将丢失动态内存,因为没有任何内容指向先前分配的动态地址。


推荐阅读