c-让用户定义数组的大小



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

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

有两种方法可以做到这一点。如果阵列大小较小,则可以使用可变长度阵列
/* Valid in C99 and later */
int n;
scanf("%d", &n);
int a[n];  

这将在堆栈上分配内存。另一种方法是,您可以使用动态内存分配,它将在堆上分配内存

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

你的想法几乎是正确的:

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

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

您必须使用指针变量:

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

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

然后u应该进行动态内存分配(malloc/caloc(。

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

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

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

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。

可变长度数组(VLA(在C99中添加到C中,但在C11中是可选的。不过,他们仍然得到广泛支持。这是在运行时定义具有用户选择大小的数组的最简单方法。

除了VLA可能在所有平台上都不可用之外,当分配失败时,它们也可能会无声地失败。这是malloc()在正确使用时避免的缺点。

不能在C中为数组赋值,而是需要将malloc()返回的值存储在指针中。注意,当分配失败时,malloc()返回NULL,允许代码检查失败并相应地继续。实际分配可能如下所示:

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

这是调用malloc()的惯用方法。请注意,不需要强制转换malloc()的结果,并且注意,sizeof的操作数不是显式类型,而是涉及a_dyn的表达式。sizeof运算符使用表达式*a_dyn类型,实际上是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 memoryn");
} 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;
}

相关内容

  • 没有找到相关文章

最新更新