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