c 中是否保证变量的连续内存分配?

问题描述 投票:0回答:3
#include<stdio.h>
int main()
{
    int a = 1, b = 10, c = 2;
    int *arr[] = {&a, &b, &c}; 
    printf("%d\n", *arr[arr[1]-arr[0]]);
    return 0;
}

我在这里得到输出

10
。通过这里的输出,我了解变量
a b c
连续分配的内存。该输出是静态的还是取决于系统?我可以期望在另一个系统中得到相同的输出吗?并且保证这些变量的连续内存分配?这里我使用gcc编译器。

c variables memory
3个回答
6
投票

arr[1]-arr[0]
(即
&b - &a
)使您的程序具有未定义的行为(UB)。
减去 2 个不是来自同一数组(或超出 1 个)的指针是 UB。

当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;
C2Xdr § 6.5.6 10


c 中是否保证变量的连续内存分配?

没有。

此输出是静态的还是取决于系统?

不,是UB。该系统有时可能会按预期“工作”,但有时则不然。

我可以期望在另一个系统中得到相同的输出吗?

其他系统可能有所不同。即使相同的系统在不同的运行中也可能有所不同。

并且这个变量的内存分配连续性是有保证的吗?

没有。


2
投票

c 中是否保证变量的连续内存分配?

任何特定对象的空间都是连续的。这包括聚合对象(结构和数组)。

否则,不同对象的集合的空间不能保证是连续的,但仅根据语言规范定义的功能很难检查。特别是,诸如

arr[1]-arr[0]
之类的指针差异仅针对指向或刚刚经过同一数组末尾的指针定义。

通过这里的输出,我了解变量

a b c
连续分配的内存。

这是一个看似合理的结论,但不能仅根据语言规范来支持。

此输出是静态的还是取决于系统?我可以期望在另一个系统中得到相同的输出吗?

语言规范中没有任何基础可以得出结论,您会在另一个系统上看到相同的内容,甚至在给定系统上看到一致的内容。

并且这个变量的内存分配连续性是有保证的吗?

绝对不是,除非已经描述过。如果您编写的代码在其他情况下依赖于连续分配,那么您的代码是危险的错误。


1
投票

并且这个变量的内存分配连续性是有保证的吗?

数组。

C标准:6.2.5

数组类型描述了连续分配的非空集合 具有特定成员对象类型的对象,称为元素类型。

这意味着对象类型必须分配在一个内存块中(因此

int
中的字节不能分布在内存中 - 并且
int
类型的变量将存储在大小为
sizeof(int)
的连续内存块中) .

但是标准并没有规定不同变量的存储顺序和位置,只规定了它们的生命周期(存储持续时间)。

© www.soinside.com 2019 - 2024. All rights reserved.