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

时间:2018-05-02 07:03:52

标签: c arrays vector dynamic-memory-allocation

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

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

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
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返回0,否则返回1 打印&#34;检查&#34;是的,我可以看到程序失败的地方 问题是无论如何,打印完最后一次检查后(检查5) 程序失败。(运行时检查失败#2)
如果有人能帮助我理解我做错了什么,我会非常感激 非常感谢阅读,并有一个美好的一天。 编辑:
我还在init中打印了数组大小/向量,看它是否打印零/空,我实际上并不需要这样做。

1 个答案:

答案 0 :(得分:1)

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])。