我'm new to C and have been trying to tackle this question. It'是the last thread I made的延续 . 我取得了一些进展,但仍然需要学习和修复 .
简而言之:
在这个问题中,“向量”是整数的一维数组 . 因此,矢量数组将是一个二维数组,其中包含一维数组 .
我需要使用这些变量:
-
int ** vectors - 2D数组
-
int size -an整数,表示**向量中存在多少向量
-
int * sizes - 一个1D的整数数组,表示向量的长度
我需要编写以下函数:
-
**int init(int vectors, int sizes, int size)
函数将内存分配给向量和大小和大小,并初始化向量以充满NULL,并将大小填充为零 . -
**int set(int *vectors, int sizes, int index, int tmp, int tmp_size)
函数接收一个空数组(向量)),释放其索引为索引的向量内的向量,并为新向量分配内存,其长度为tmp_size并放置在其中 tmp的元素 .
这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int init(int*** vectors, int** sizes, int size)
{
int i, k,j;
*sizes = (int*)malloc(size * sizeof(int));
if (*sizes == NULL)
return 0;
for (j = 0; j < size; j++)
{
(*sizes)[j] = 0;
}
*vectors = (int**)malloc(size * sizeof(int*));
if (*vectors == NULL)
return 0;
for (i = 0; i < size; i++)
{
(vectors)[i] = NULL;
}
return 1;
}
int set(int **vectors, int *sizes, int index, int *tmp, int tmp_size)
{
if ((vectors)[index] != NULL)
{
free((vectors)[index]);
}
(vectors)[index] = (int*)malloc(tmp_size * sizeof(int));
if ((vectors)[index] == NULL)
return 0;
for (int b = 0; b < tmp_size; b++)
{
(vectors)[index][b] = tmp[b];
}
sizes[index] = tmp_size;
return 1;
}
int main()
{
int size, i, length, indexhere;
int** vectors = NULL;
int* sizes = NULL;
int* tmp = NULL;
int* p = &vectors;
int tempindex;
printf("\nPlease enter an amount of vectors:\n");
scanf("%d", &size);
init(p, &sizes, size);
printf("Enter index\n");
scanf("%d", &indexhere);
printf("Enter Length\n");
scanf("%d", &length);
tmp = (int*)malloc(length * sizeof(int));
printf("Enter elements:\n");
for (int g = 0; g < length; g++)
scanf("%d", &tmp[g]);
set(&vectors, sizes, indexhere, tmp, length);
system("pause");
return 0;
}
有人可以解释为什么程序总是崩溃?
3 回答
在
init
函数(vectors)[i] = NULL;
实际应该是(*vectors)[i] = NULL;
从
main
调用set
函数时,应该传递vectors
而不是&vectors
.你的代码中似乎也有几个指针类型不匹配,所以你应该注意编译器的警告 . 这是因为不幸的是,C允许在不兼容的指针之间进行隐式转换,这与C不同 .
你这样打电话
set
但第一个参数被声明为
int **
. 通过&vector
传递一个指向vector
的指针,即int ***
类型的指针 . 这种不匹配将导致未定义的行为和可能的崩溃 .这是一个完整的工作示例 .