感谢您花时间阅读本文
在我的问题a" vector"被定义为一维整数数组
因此,矢量数组将是2D维数组,其中每个矢量可以具有不同的长度
我被要求使用:
int **矢量 - 2D阵列
int size -an整数,表示**向量中存在多少向量
int * sizes - 一个整数的1D数组,表示向量的长度
例如,for:
vectors = {{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()的开头输入大小,**矢量& *大小用动态分配大小的值。
我要求写下这个功能:
int init(int *** vectors,int ** sizes,int size),它将**向量初始化为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返回0,否则返回1
打印&#34;检查&#34;是的,我可以看到程序失败的地方
问题是无论如何,打印完最后一次检查后(检查5)
程序失败。(运行时检查失败#2)
如果有人能帮助我理解我做错了什么,我会非常感激
非常感谢阅读,并有一个美好的一天。
编辑:
我还在init中打印了数组大小/向量,看它是否打印零/空,我实际上并不需要这样做。
答案 0 :(得分: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]
)。