以下是否正确?
"堆中的向量(
sbrk
或malloc
)从低地址开始,然后转到高位#34;
例如:
int *vec = sbrk(5*sizeof(int)):
vec[0]
位于0x500
地址,vec[1]
位于0x504
。
但是在堆栈中,int vec[5]
从高地址变为低地址。
例如:
vec[0]
位于0xFF8
vec[1]
位于0xFF4
。是不是?
答案 0 :(得分:6)
不,这不是真的。
当通常堆栈"向下"时,这仅对向其添加新对象有效。对象本身的内容仍然与在堆上分配的顺序相同。
否则你不能做指针算术。
答案 1 :(得分:2)
这绝对不对:数组逻辑元素的连续地址之间的偏移在符号和幅度上必须始终相同。否则,这个简单的代码将无效:
void foo(int *a, size_t p, int k) {
a[p] = k;
printf("%d\n", a[p]);
}
...
int *x = malloc(5*sizeof(int));
int y[5];
foo(x, 2, 3);
foo(y, 2, 3);
可以上下移动的是动态和自动内存中分配的不同数组的地址。例如,如果你这样做
int *x1 = malloc(5*sizeof(int));
int *y1 = malloc(5*sizeof(int));
VS。此
int x2[5];
int y2[5];
&x1[0]
/ &y1[0]
与&x2[0]
/ &y2[0]
的相对地址可能相反。但是,即使这样也无法保证,因为所有这些都取决于实施。
答案 2 :(得分:1)
没有。 "从低地址开始,然后转到高地址"参考后续的分配。在一个街区内,它总是一样的。
此外,你只对一个块进行malloc,块不知道它是两个int32的向量还是只有一个int64。只有在您将其投入int*
后,您才能应用"内部结构"它。或者,更确切地说,"结构"仅在取消引用指针时使用。
答案 3 :(得分:0)
我不知道有任何基于PC的语言使用像数组这样的堆栈(std :: stack是最后一个输出,但我不认为它是自上而下的。)
IBM大型机,一些ARM工具集和其他平台都有一个以符号(.bes)段类型结束的块,其中数组的名称指向数组的末尾(超过最后一个元素的1),因此数组将被寻址类似于堆栈(自上而下)。除汇编语言外,我不知道支持这种语言的语言。