使用NULL的阵列分配存储器给2D阵列(c)中(Allocating memory to 2D ar

2019-10-28 13:26发布

感谢您抽出时间阅读本。
在我的问题“载体”被定义为一个一维整数维阵列。
因此矢量的阵列将是一个2D维阵列,其中每个载体可以是不同的长度。
有人问我使用方法:
INT ** vectors- 2D阵列
INT大小-an整数,它表示许多载体内如何存在**矢量
INT *尺寸-一个整数的一维数组,表示向量的长度

例如,用于:
向量= {{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是第一矢量的长度等)。
大小是由用户在主开始输入()和**矢量&*尺寸dynimacilly与大小的值进行分配。

有人问我写的函数:
INT的init(INT ***载体,INT **尺寸,INT尺寸),该初始化矢量**为空值和*大小的阵列的为0的数组。
我想出了这个代码:

#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;
}

忘了提及,初始化如果它不能以其它方式分配存储器和1返回0。
打印“检查”了,所以我可以看到该程序失败。
问题是,不管是什么,打印最后检查后(检查5)程序失败。(运行时检查失败#2)
如果有人能帮助我理解我在做什么错了,我会非常欣赏它。
非常感谢阅读,并有一个美好的一天。 编辑:
我还印阵列尺寸/载体内INIT只是为了看看它打印零/空值,我实际上并不需要做。

Answer 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]



文章来源: Allocating memory to 2D array using an array of NULL (c)