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

标签 c arrays vector dynamic-memory-allocation

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

例如,对于:
vector = {{4,3,4,3},{11,22,33,44,55,66},NULL,{5},{3,33,333,33,3}}。
大小为5( vector 内有5个 vector )。
大小为 {4,6,0,1,5}(4 是第一个 vector 的长度,依此类推)。
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 中打印了数组大小/vector ,只是为了看看它是否打印零/空值,我实际上不需要这样做。

最佳答案

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) (或 (*尺寸)[j])。

关于c - 使用 NULL 数组将内存分配给二维数组 (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50128851/

相关文章:

c - 两个代码片段有什么区别?

c - 失败/退出时监控和重启子进程

javascript - 数组数组中对象的总和值

r - 从 R 中的向量列表中索引特定数值向量

c++ - 从指向基类型的指针 vector ,返回派生类型的第一个元素,转换为派生类型

c - 检查字符时使用哈希表或数组作为位图

c++ - 我在 main 下的输出不是我所期望的

C 程序,用户输入到单个数组中

c++ - 在基于范围的 for 循环中从 std::vector<Object> 获取指向对象的指针

c - 如何在C中读取特定关键字的json数据包?