c - 关于在 C 中为整数分配内存的一般问题
问题描述
我目前正在学习 C 中的动态内存分配,并且对特定概念有困难。为了将 malloc 用于特定整数,我需要在该空间内放置一个先前声明的整数。
以下是我作为代码放入的内容。
void example(int ab)
{
int* intPtr=(int*)malloc(sizeof(int));
*intPtr = &ab;
}
我不是想运行程序或任何东西。我只是想看看我是否对一些基本的内存分配有正确的想法。
解决方案
几乎没有问题,首先不需要对结果进行类型转换,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
的,编译器应该警告你喜欢
int
main.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 */
然后您将使用堆栈创建的内存(即局部变量的地址)覆盖动态内存,在这种情况下,您将丢失动态内存,因为没有任何内容指向先前分配的动态地址。
推荐阅读
- delphi - Delphi Tokyo 10.2 需要从 repo 更新代码后重建整个项目
- git - 从 GitHub 克隆一个 Forked 项目
- javascript - Vuejs Dropzone - 当dropzone中已经有一些图像时如何包含“+”图标
- excel - 编写一个 for 循环以查找从活动行到最后一个工作表末尾的值
- javafx - JavaFx 音量滑块不会改变音量。音量保持不变
- mysql - Qlikview 和 SQL 查询结果的区别
- c# - 如何遍历 WebGrid 并获取 DropDownList 的选定值?
- vue.js - 如何在 Element UI 表格中显示嵌套单元格?
- python - 如何点击搜索公司名称按钮,输入公司名称并使用 Selenium 和 Python 进行搜索?
- sql - 从列销售中每 7 行求和一次,而整数表示距离安装促销材料的 n 天(安装之前和之后)