我正在使用不等的第二维尺寸的多维数组。 让我们假设我需要以下数据结构:
[&安培; PTR0] - GT; [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
[&安培; PTR1] - GT; [0] [1] [2]
[&安培; PTR2] - GT; [0] [1] [2] [3] [4]
int main()
{
int *a[3];
int *b;
int i;
a[0] = (int *)malloc(10 * sizeof(int));
a[1] = (int *)malloc(2 * sizeof(int));
a[2] = (int *)malloc(4 * sizeof(int));
for(i=0; i<10; i++) a[0][i]=i;
for(i=0; i<2; i++) a[1][i]=i;
for(i=0; i<4; i++) a[2][i]=i;
}
我做了一些测试,看起来我可以在[1] [3]处存储一个值。这是否意味着我的数组中的行大小相等10?
答案 0 :(得分:5)
不,地址a [1] [3]不“正式存在”。它是一个未在程序中定义的内存,访问它会导致未定义的行为。
可能会导致以下错误:
答案 1 :(得分:2)
您的代码是未定义的行为。您正在访问您不拥有的内容。它可能有用,但可能没有,但它总是错误的。
答案 2 :(得分:1)
程序中有大量内存用于I / O缓冲区,库数据结构,malloc系统本身,命令行参数和环境等(其中一些存在于堆栈中。)
是的,你可以破坏范围之外的东西。
请注意,x[i]
与*(x + i)
相同。因此,计算您引用的地址很容易。它可能覆盖您的一个数据结构,它可能覆盖您的数据结构的一部分,这是malloc机制中的私有字段,或者它可能覆盖库数据。