使用malloc()的具有不等第二维度大小的多维数组
我正在玩弄大小不等的二维多维数组。 假设我需要以下数据结构: [&ptr0]->[0][1][2][3][4][5][6][7][8][9] [&ptr1]->[0][1][2] [&ptr2]->[0][1][2][3][4]使用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
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指向的类型))是的,这就是它的实现方式,但我的意思是:在Cx[I]
中,确实可以用*(x+I)代替
。类型大小的乘法是由编译器提供的。好的,所以在一次大的运行中,我可能会得到一个运行时错误。谢谢,这正是我不确定的。指针不是一件容易的事情,当你开始的时候。我建议你使用Valgrind。它是一个可以检测内存泄漏和你在这篇文章中提到的问题的工具。