#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编译器。
arr[1]-arr[0]
(即&b - &a
)使您的程序具有未定义的行为(UB)。当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;
C2Xdr § 6.5.6 10
c 中是否保证变量的连续内存分配?
没有。
此输出是静态的还是取决于系统?
不,是UB。该系统有时可能会按预期“工作”,但有时则不然。
我可以期望在另一个系统中得到相同的输出吗?
其他系统可能有所不同。即使相同的系统在不同的运行中也可能有所不同。
并且这个变量的内存分配连续性是有保证的吗?
没有。
c 中是否保证变量的连续内存分配?
任何特定对象的空间都是连续的。这包括聚合对象(结构和数组)。
否则,不同对象的集合的空间不能保证是连续的,但仅根据语言规范定义的功能很难检查。特别是,诸如
arr[1]-arr[0]
之类的指针差异仅针对指向或刚刚经过同一数组末尾的指针定义。
通过这里的输出,我了解变量
连续分配的内存。a b c
这是一个看似合理的结论,但不能仅根据语言规范来支持。
此输出是静态的还是取决于系统?我可以期望在另一个系统中得到相同的输出吗?
语言规范中没有任何基础可以得出结论,您会在另一个系统上看到相同的内容,甚至在给定系统上看到一致的内容。
并且这个变量的内存分配连续性是有保证的吗?
绝对不是,除非已经描述过。如果您编写的代码在其他情况下依赖于连续分配,那么您的代码是危险的错误。
并且这个变量的内存分配连续性是有保证的吗?
数组。
C标准:6.2.5
数组类型描述了连续分配的非空集合 具有特定成员对象类型的对象,称为元素类型。
这意味着对象类型必须分配在一个内存块中(因此
int
中的字节不能分布在内存中 - 并且 int
类型的变量将存储在大小为 sizeof(int)
的连续内存块中) .
但是标准并没有规定不同变量的存储顺序和位置,只规定了它们的生命周期(存储持续时间)。