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

使用malloc()的具有不等第二维度大小的多维数组,c,multidimensional-array,malloc,C,Multidimensional Array,Malloc,我正在玩弄大小不等的二维多维数组。 假设我需要以下数据结构: [&ptr0]->[0][1][2][3][4][5][6][7][8][9] [&ptr1]->[0][1][2] [&ptr2]->[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] = (in

我正在玩弄大小不等的二维多维数组。 假设我需要以下数据结构:

[&ptr0]->[0][1][2][3][4][5][6][7][8][9]

[&ptr1]->[0][1][2]

[&ptr2]->[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;
}
intmain()
{
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));

对于(i=0;i这是您代码的未定义行为。您正在访问您不拥有的东西。它可能工作,也可能不工作,但总是错误的。


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

是的,你可以把东西打得超出范围


请记住,
x[i]
*(x+i)
是一样的。因此,计算您引用的地址很容易。它可能会覆盖您的一个数据结构,可能会覆盖您的数据结构的一部分,它是malloc机制中的一个私有字段,也可能会覆盖库数据。

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

这可能导致以下错误:

  • 分段故障(访问a 受限制内存)
  • 已使用其他变量已使用的内存(其他分配内存)(因此可能会覆盖)
  • 它可以是未初始化的值(未启用的内存地址)

谢谢,现在我明白了如何计算访问内存位置的确切地址“(x+I)”确切地说,它应该是*(x+isizeof(x指向的类型))是的,这就是它的实现方式,但我的意思是:在C
x[I]
中,确实可以用
*(x+I)代替
。类型大小的乘法是由编译器提供的。好的,所以在一次大的运行中,我可能会得到一个运行时错误。谢谢,这正是我不确定的。指针不是一件容易的事情,当你开始的时候。我建议你使用Valgrind。它是一个可以检测内存泄漏和你在这篇文章中提到的问题的工具。