让用户定义数组的大小

时间:2018-11-29 06:54:28

标签: c arrays malloc

如何让用户选择一个数字,例如n,然后创建大小为n的数组?

我能说int a[]=malloc (n*sizeof(int))吗?

5 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点。如果数组大小较小,则可以使用可变长度数组

/* Valid in C99 and later */
int n;
scanf("%d", &n);
int a[n];  

这将在堆栈上分配内存。其他方法是您可以使用动态内存分配,这将在堆上分配内存

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

答案 1 :(得分:2)

是的,如果您想在运行时设置数组的大小。

然后您应该进行动态内存分配(malloc / calloc)。

int a[]=malloc (n*sizeof(int));//this not possible.
int *a =malloc (n*sizeof(int)); // this is possible.

答案 2 :(得分:2)

您的想法几乎是正确的:

int a[] = malloc(n*sizeof(int));

使用malloc是正确的方法。 但是您不能将返回的地址分配给数组。

您必须改为使用指针变量:

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

答案 3 :(得分:2)

有两种基本的分配内存的方法来创建一个数组,其中将数组的大小确定为输入:

第一个是 在内存的“堆栈”段中为数组分配内存,其中将数组的大小作为输入蚂蚁,然后定义该特定大小的数组并相应地授予内存。

int n;
scanf("%d",&n);            //scanning the size
int arr[n];                //declaring the array of that particular size here

第二个是 在内存的“堆”段中分配所需的内存。它是在运行时(程序执行)期间分配的内存 因此,另一种声明由用户定义大小的数组的方法是

int n,*arr;
scanf("%d",&n);
arr=malloc(n*sizeof(int));        //malloc function provides a contiguous space 

arr=calloc(n,sizeof(int));      //calloc function is similar,initializes as 0

要同时使用这两个功能,请确保包含stdlib.h。

答案 4 :(得分:0)

使用C99将可变长度数组(VLA)添加到C,但对于C11使其可变。但是,它们仍然得到广泛支持。这是在运行时用用户选择的大小定义数组的最简单方法。

除了VLA并非在所有平台上都可用之外,当分配失败时,它们也可能会静默失败。 malloc()可以避免在正确使用时产生的缺点。

您无法在C中分配给数组,而是需要将malloc()返回的值存储在指针中。请注意,在分配失败时,malloc()返回NULL,从而使代码可以检查失败并继续进行操作。实际分配可能如下所示:

int *a_dyn = malloc(sizeof *a_dyn * arr_sz);

这是调用malloc()的惯用方式。请注意,存在no need to cast the result of malloc(),并且请注意,sizeof的操作数不是显式类型,而是涉及a_dyn的表达式。 sizeof运算符使用表达式*a_dyn type ,实际上它是int(没有取消引用)。与使用显式类型进行编码相比,在程序生命周期中类型发生更改时,这种方法更容易出错,并且更易于维护。另请注意,sizeof表达式位于arr_sz之前。这是遵循的好习惯:有时您可能会打如下电话:

int *arr = malloc(sizeof *arr * nrows * ncols);

放置sizeof首先会强制使用size_t值进行乘法运算,从而有助于避免乘法运算中出现溢出问题。

别忘了不再使用malloc()分配的任何内存,避免内存泄漏。

无论您使用VLA还是malloc(),都必须在使用之前验证用户输入,以免发生未定义的行为。尝试分配一个非正大小的数组会导致未定义的行为,而尝试分配过多的内存将导致分配失败。

这是一个示例程序,说明了所有这些内容:

#include <stdio.h>
#include <stdlib.h>

#define ARR_MAX  1024                 // some sensible maximum array size

int main(void)
{
    int arr_sz;
    int ret_val;
    /* validate user input */
    do {
        printf("Enter array size: ");
        ret_val = scanf("%d", &arr_sz);
    } while (ret_val != 1 || arr_sz < 1 || arr_sz > ARR_MAX);

    /* use a VLA */
    int a_vla[arr_sz];
    for (int i = 0; i < arr_sz; i++) {
        a_vla[i] = i;
        printf("%d ", a_vla[i]);
    }
    putchar('\n');

    /* use malloc() */
    int *a_dyn = malloc(sizeof *a_dyn * arr_sz);
    if (a_dyn == NULL) {                                 // malloc failure?
        fprintf(stderr, "Unable to allocate memory\n");
    } else {                                             // malloc success
        for (int i = 0; i < arr_sz; i++) {
            a_dyn[i] = i;
            printf("%d ", a_dyn[i]);
        }
        putchar('\n');
    }

    /* avoid memory leaks */
    free(a_dyn);

    return 0;
}