使用malloc()的第二个维度大小不等的多维数组

时间:2010-03-08 00:14:33

标签: c multidimensional-array malloc

我正在使用不等的第二维尺寸的多维数组。 让我们假设我需要以下数据结构:

[&安培; 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?

3 个答案:

答案 0 :(得分:5)

不,地址a [1] [3]不“正式存在”。它是一个未在程序中定义的内存,访问它会导致未定义的行为。

可能会导致以下错误:

  • 分段错误(访问a 限制记忆)
  • 使用其他变量(其他分配内存)已经使用的内存(可能会覆盖)
  • 它可以是未初始化的值(未使用的内存地址)

答案 1 :(得分:2)

您的代码是未定义的行为。您正在访问您不拥有的内容。它可能有用,但可能没有,但它总是错误的。

答案 2 :(得分:1)


程序中有大量内存用于I / O缓冲区,库数据结构,malloc系统本身,命令行参数和环境等(其中一些存在于堆栈中。)

是的,你可以破坏范围之外的东西。

请注意,x[i]*(x + i)相同。因此,计算您引用的地址很容易。它可能覆盖您的一个数据结构,它可能覆盖您的数据结构的一部分,这是malloc机制中的私有字段,或者它可能覆盖库数据。