堆中的向量与堆栈中的向量

时间:2015-11-05 11:25:08

标签: c vector stack heap

以下是否正确?

  

"堆中的向量(sbrkmalloc)从低地址开始,然后转到高位#34;

例如:

int *vec = sbrk(5*sizeof(int)):

vec[0]位于0x500地址,vec[1]位于0x504

但是在堆栈中,int vec[5]从高地址变为低地址。

例如:

  • vec[0]位于0xFF8
  • vec[1]位于0xFF4

是不是?

4 个答案:

答案 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),因此数组将被寻址类似于堆栈(自上而下)。除汇编语言外,我不知道支持这种语言的语言。