如何让用户选择一个数字,比如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;
}