gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:48:51 25 4
gpt4 key购买 nike

感谢您花时间阅读本文。
在我的问题中,“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com