使用 NULL 数组将内存分配给二维数组 (c)

Posted

技术标签:

【中文标题】使用 NULL 数组将内存分配给二维数组 (c)【英文标题】:Allocating memory to 2D array using an array of NULL (c) 【发布时间】:2018-10-12 05:19:08 【问题描述】:

感谢您花时间阅读本文。 在我的问题中,“向量”被定义为一维整数数组。 因此,向量数组将是一个二维数组,其中每个向量都可以具有不同的长度。 我被要求使用: int** 向量 - 二维数组 int size - 一个整数,表示 **vectors 中存在多少个向量 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 是第一个向量的长度,依此类推)。 size 由用户在 main() 开始时输入,**vectors&*sizes 动态分配 size 的值。

我被要求编写函数: int init(int ***vectors, int **sizes, int size) 将 **vectors 初始化为 NULL 数组,将 *sizes 初始化为 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;

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

【问题讨论】:

不要成为Three Star Programmer。哦,指向指针的指针不是 2d-Array ... 我刚在课堂上被介绍给指针,我的作业特别要求我们使用三颗星......对不起,如果它是愚蠢的 使用警告,例如`警告:格式'%d'需要'int'类型的参数,但参数2有'int *'类型 [-Wformat=] printf("%d", *(大小 + j));` @Ultraviolence 它被许多人认为是一种代码气味。当然,无论如何你都可以让它工作——这不是一个好主意,不同的设计会更好:) 【参考方案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])。

【讨论】:

非常感谢鲍勃,这实际上使程序没有崩溃。非常感谢!

以上是关于使用 NULL 数组将内存分配给二维数组 (c)的主要内容,如果未能解决你的问题,请参考以下文章

试图将一个连续的动态二维数组从 C 传递到 Fortran

试图将一个连续的动态二维数组从 C 传递到 Fortran

将字符分配给在 C 中使用 malloc 声明的二维数组时收到警告

c++ 二维数组内存分配

如何为二维数组分配和释放堆内存?

二维数组的语法