我目前正在学习C语言中的动态内存分配,并且对特定概念有困难。对于将malloc用于特定整数,我需要在该空间中放置一个先前声明的整数。
以下是我作为代码添加的内容。
void example(int ab)
{
int* intPtr=(int*)malloc(sizeof(int));
*intPtr = &ab;
}
我不是要运行程序或任何东西。我只想看看我是否对某些基本内存分配有正确的想法。
答案 0 :(得分:0)
几乎没有问题,首先不需要转换malloc()
的结果,因为它是由编译器隐式完成的。 Read Do I cast the result of 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-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 */
然后,您使用堆栈创建的内存(即局部变量的地址)覆盖动态内存,在这种情况下,由于没有内容指向先前分配的动态地址,您正在丢失动态内存。