C 2D阵列动态内存分配崩溃

C 2D阵列动态内存分配崩溃,c,calloc,dynamic-allocation,C,Calloc,Dynamic Allocation,可能重复: 我正在尝试使用calloc为二维数组动态分配内存。列固定为2,因此只有行是动态的 以下是我一直在尝试的: unsigned int **pts, rows; int main() { //some code pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **)); } //The code to access the array : for(k=1;k<=i;k++) { p

可能重复:

我正在尝试使用calloc为二维数组动态分配内存。列固定为2,因此只有行是动态的

以下是我一直在尝试的:

unsigned int **pts, rows;
int main()
{
    //some code

    pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **));
}


//The code to access the array :
for(k=1;k<=i;k++)
{
    printf("\nX%d=",k);
    scanf("%d",&pts[k][0]);
    printf("\nY%d=",k);
    scanf("%d",&pts[k][1]);
}
unsigned int**pts,行;
int main()
{
//一些代码
pts=(unsigned int**)calloc(2*行,sizeof(unsigned int**));
}
//访问阵列的代码:

对于(k=1;k,以下是方法:

pts = (unsigned int **)calloc(rows, sizeof (unsigned int *));
for(int i = 0; i < rows; i++) {
    pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int));
}
pts=(unsigned int**)calloc(rows,sizeof(unsigned int*);
对于(int i=0;i
都铎的答案是正确的解决方案。
但为了更深入地了解代码错误的原因

您的代码实际上只是分配一个数组,长度为2*行,指针指向int类型的指针

您试图创建的是:

an array of int** -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> ...more
您实际创建的是:

an array of int** -> int* -> nothing (null address)
                  -> int* -> nothing...
                  -> ...more
然后,您尝试将一个int分配给int**数组中初始化为零的int*所指向的一个null地址(您可以看到,calloc已确保所有int*都为零)

当你试图执行

scanf("%d",&pts[k][0]);

pts[k]指int**数组中的第(k-1)个元素,但如上所示,尽管代码确实为该元素分配了空间,但它已将其初始化为零指向NULL。所以scanf已经获得了一个基于零偏移量的地址…现在你应该清楚这是无效的。

你能在访问数组的地方发布代码吗?谢谢Tudor!还有一个问题。我能不能写2*行并只使用calloc一次?@Nik:不,你需要将每一行分配给每个人如果你使用指针指向指针,我会很高兴的。再次感谢。我需要学习更多:)在C语言中,所有这些类型都是无用的。为了清晰的图片@尼克,不客气。我记得我在大学一年级时也犯过同样的错误。。。lolz