如何在没有预定义大小的C中在数组中创建数组?

时间:2017-11-15 08:54:26

标签: c arrays syntax malloc

我想在C中的数组中创建数组,而没有预定义数量的字符或数组中的输入。 以下是我的代码:

{
    int noOfStudents,noOfItems;
    int *grades;
    int i;
    char a[];
    printf("Please enter number of students\n");
    scanf("%d", &noOfStudents);
    printf("Please enter number of items\n");
    scanf("%d", &noOfItems);

    for (i = 0; i < noOfStudents; i++)
    {
        a[i] = (int *)malloc((sizeof(int))*noOfItems);
    }

我被抛出错误

  

c(2133):'a':未知大小

如何通过malloc成功在数组中创建数组?

4 个答案:

答案 0 :(得分:2)

您可以使用VLA (Variable length array)

您需要重新安排代码,例如

int noOfStudents = -1, noOfItems = -1;
int *grades;                                //is it used?
int i;

printf("Please enter number of students\n");
scanf("%d", &noOfStudents);

//fail check

int *a[noOfStudents];             // this needs to be proper.

//VLA

printf("Please enter number of items\n");
scanf("%d", &noOfItems);

//fail check

for (i = 0; i < noOfStudents; i++)
{
    a[i] = malloc(noOfItems * sizeof(a[i]));   //do not cast
}

答案 1 :(得分:2)

您需要一个二维数组来保存整数项列表。你可以通过在整数指针上声明一个指针来做到这一点。

所以你要声明

printf("Please enter number of students\n");
if (scanf("%d", &noOfStudents)==0 && noOfStudents<=0)  // bonus: small safety
{
    printf("input error\n");
    exit(1);
}
// now we are sure that noOfStudents is strictly positive & properly entered
a = malloc(sizeof(int*)*noOfStudents);

然后

malloc

然后你分配了你的指针数组,其余代码都没问题(不要转换a = malloc(sizeof(*a)*noOfStudents); BTW的返回值

变体是:

a

(因此,如果{{1}}的类型发生变化,则大小如下,而不是因为它们是所有指针而在此处重要)

答案 2 :(得分:0)

使用指针代替数组,并使用malloccalloc函数动态分配该指针的内存。

像这样:

int *a;

a = malloc((sizeof(int)*noOfItems);

答案 3 :(得分:-2)

您可以尝试函数malloc,它会动态分配内存并返回指向它的指针。然后,您可以将指针强制转换为指向某种类型数组的指针。