使用NULL数组将内存分配给2D数组(c)

感谢您花时间阅读本文。
在我的问题中,“向量”被定义为整数的一维数组。
因此,矢量arrays将是2D维arrays,其中每个矢量可以具有不同的长度。
我被要求使用:
int ** vectors – 2D数组
int size -an整数,表示**向量中存在多少向量
int * sizes – 一个整数的1D数组,表示向量的长度

例如,对于:
vectors = {{4,3,4,3},{11,22,33,44,55,66},NULL,{5},{3,33,333,33,3}}。
大小为5(向量内有5个向量)。
size是{4,6,0,1,5}(4是第一个向量的长度,依此类推)。
用户在main()的开头输入大小,**矢量&*大小用动态分配大小的值。

我被要求写这个函数:
int init(int *** vectors,int ** sizes,int size),它将**向量初始化为NULL数组,将* sizes初始化为零数组。
我想出了这段代码:

#define _CRT_SECURE_NO_WARNINGS #include  #include  int init(int*** vectors, int** sizes, int size) { int i, k,j; printf("check\n"); *vectors = (int**)malloc(size * sizeof(int*)); if (*vectors == NULL) return 0; for (i = 0; i < size; i++) { *(vectors + i) = NULL; } printf("check 2\n"); for (k = 0; k<size; k++) { if (*(vectors+k) != NULL) printf("didn't work\n"); else printf("current is null\n"); } *sizes= (int*)malloc(size * sizeof(int)); if (*sizes == NULL) return 0; for (j= 0; j < size; j++) { *(sizes + j) = 0; printf("%d ", *(sizes + j)); } printf("\n"); return 1; } int main() { int size, i; int** vectors = NULL; int* sizes = NULL; printf("\nPlease enter an amount of vectors:\n"); scanf("%d", &size); printf("%d\n", init(&vectors, &sizes, size)); printf("size is %d now\n", size); // for (i = 0; i < size; i++) // printf("%d ", *(sizes+i)); printf("check 3\n"); free(sizes); free(vectors); printf("check 4\n"); printf("check 5\n"); return 0; } 

忘了提一下,如果init无法分配内存,则init返回0,否则返回1。
打印“支票”是我可以看到程序失败的地方。
问题是无论如何,在打印完最后一次检查(检查5)后程序失败。(运行时检查失败#2)
如果有人能帮助我理解我做错了什么,我会非常感激。
非常感谢阅读,并有一个美好的一天。 编辑:
我还在init中打印了数组大小/向量,看它是否打印零/空,我实际上并不需要这样做。

OP代码的一个问题是指针算法。 鉴于:

 int ***vectors; *vectors = malloc(size * sizeof(int*)); 

这个循环:

 for (i = 0; i < size; i++) { *(vectors + i) = NULL; } 

迭代下一个未分配的指针指向指向 int的指针 ,而OP需要的是

 for (i = 0; i < size; i++) { *(*vectors + i) = NULL; // or (*vectors)[i] = NULL; } 

在以下循环中也是如此,其中使用*(sizes + j)而不是*(*sizes + j) (或(*sizes)[j] )。