使用 NULL 数组为二维数组分配内存 (c)
Allocating memory to 2D array using an array of NULL (c)
感谢您花时间阅读本文。
在我的问题中,"vector" 被定义为一维整数数组。
因此,向量数组将是一个二维数组,其中每个向量的长度都可以不同。
我被要求使用:
int** 向量-二维数组
int size - 一个整数,表示 **vectors
中存在多少个向量
int* sizes-表示向量长度的一维整数数组
例如,对于:
向量 = {{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() 的开头输入,并且 **vectors&*sizes 动态分配大小的值。
我被要求编写函数:
int init(int ***vectors, int **sizes, int size) 将 **vectors 初始化为 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 returns 如果分配内存失败则为 0,否则为 1。
打印 "checks" 是为了让我可以看到程序失败的地方。
问题是无论如何,在打印最后一张支票后(检查 5)
程序失败。(运行-Time Check Failure #2)
如果有人可以帮助我理解我做错了什么,我将不胜感激。
非常感谢阅读,祝你有美好的一天。
编辑:
我还在 init 中打印了数组 sizes/vectors 只是为了看看它是否打印 zeros/nulls,我实际上不需要这样做。
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]
)。
感谢您花时间阅读本文。
在我的问题中,"vector" 被定义为一维整数数组。
因此,向量数组将是一个二维数组,其中每个向量的长度都可以不同。
我被要求使用:
int** 向量-二维数组
int size - 一个整数,表示 **vectors
中存在多少个向量
int* sizes-表示向量长度的一维整数数组
例如,对于:
向量 = {{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() 的开头输入,并且 **vectors&*sizes 动态分配大小的值。
我被要求编写函数:
int init(int ***vectors, int **sizes, int size) 将 **vectors 初始化为 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 returns 如果分配内存失败则为 0,否则为 1。
打印 "checks" 是为了让我可以看到程序失败的地方。
问题是无论如何,在打印最后一张支票后(检查 5)
程序失败。(运行-Time Check Failure #2)
如果有人可以帮助我理解我做错了什么,我将不胜感激。
非常感谢阅读,祝你有美好的一天。
编辑:
我还在 init 中打印了数组 sizes/vectors 只是为了看看它是否打印 zeros/nulls,我实际上不需要这样做。
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]
)。