在C中给出以下代码片段:
int* x;
x = (int *) malloc(40);
我们知道这是一个显式的堆动态分配。
如果我将代码更改为:
int* x = (int *) malloc(40);
它仍然是一个明确的堆动态吗?我的朋友认为它是一个堆栈动态,但我认为它是一个显式的堆动态,因为我们从堆中分配内存。
显式堆动态定义为由程序员编写的显式运行时指令分配和释放的变量。这不意味着任何malloc / calloc调用都是显式堆吗?
编辑:我和我的教授谈过,她为我澄清了一些东西。当我们宣布类似
的内容时char * str = (char *) malloc(15);
我们说str是数据类型的char指针,并且具有堆栈动态存储绑定。但是,当我们引用str引用的对象时,我们说它是显式堆动态的。
答案 0 :(得分:2)
首先,如果要将malloc
的结果存储在变量中,则将其正确地声明为指针,而不是int。
存储malloc导致int的问题是,您可能会在以后取消引用它时截断指针并炸毁它。例如,如果您在64位系统上运行该表达式,则malloc将返回一个8字节指针。但是,由于您将其分配给4字节的int,因此会被截断。不好。
您的代码应该是这样的:
int* x = (int*)malloc(bla);
无论如何,int指针x
本身存储在堆栈中。但是不要让两个人感到困惑。 X本身是堆栈上的指针,但它指向堆上分配的内存。
注意:
32位应用程序(通常)有4个字节的指针。
64位应用程序(通常)有8个字节的指针。
答案 1 :(得分:1)
是的,malloc
在堆上分配请求的内存。堆内存用于增长和缩小的动态数据结构。
答案 2 :(得分:1)
来自标准6.3.2.3
任何指针类型都可以转换为整数类型。除了之前指定的,结果是实现定义的。 如果结果无法以整数类型表示,则行为未定义 。结果不必在任何整数类型的值范围内。
这就是为什么指针的类型应该是int*
。此外,不需要投射 - void*
至int*
转换将在此处隐式完成。
另外,为什么你认为使用初始化程序声明变量或不使用初始化程序会影响*alloc
及其友元函数分配的内存的存储持续时间。事实并非如此。
有趣的事物x
具有自动存储持续时间(通常这是使用堆栈实现的)但它包含的内存(是x
的类型将是int*
) - 它将被分配储存期限。事情是堆/堆栈不是C标准指定或提到的东西。大多数实现通常使用堆实现分配的存储持续时间。