如何让用户选择一个数字,例如n,然后创建大小为n的数组?
我能说int a[]=malloc (n*sizeof(int))
吗?
答案 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;
}