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

A vector in the heap vs in the stack

以下是否正确?

"A vector in the heap (with sbrk or malloc) starts in the low address and goes to the high ones".

例如:

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

vec[0] 在地址 0x500vec[1]0x504.

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

例如:

对吗?

不,这不是真的。

虽然通常堆栈"goes down",这仅对向其添加新对象有效。对象本身的内容仍然与在堆上分配的顺序相同。

否则你不能做指针运算。

没有。 "starts in the low address and goes to the high ones" 指的是后续的分配。一个街区之内,始终如一。

此外,您只 malloc 一个块,该块不知道它是两个 int32 的向量还是只有一个 int64。只有在将其转换为 int* 之后,您才会对其应用 "internal structure"。或者,更准确地说,"structure" 仅在取消引用指针时使用。

这是绝对不对的:数组逻辑元素的连续地址之间的偏移量在符号和大小上必须始终相同。否则,这个简单的代码将无法工作:

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));

对比这个

int x2[5];
int y2[5];

&x1[0]/&y1[0]&x2[0]/&y2[0] 的相对地址 可能 方向相反。然而,即使这样也不能保证,因为这一切都取决于实施。

我不知道有任何基于 PC 的语言使用数组之类的堆栈(std::stack 是后进先出,但我不认为它的地址是自上而下的)。

IBM 大型机、一些 ARM 工具集和其他平台有一个以符号 (.bes) 段类型结束的块,其中数组名称指向数组的末尾(最后一个元素后的 1),因此数组的寻址类似于堆栈(自上而下)。除了汇编语言,我不知道还有什么语言支持这个。