当我输入一个字母时,我的函数有效,但当我输入整数时,它无效



我正在尝试创建一个函数,该函数将要求用户输入一个数字来确定数组的大小,然后将数字输入到数组中。然后我需要打印数组,并交换其中最小和最大的数字


#include <stdio.h>
void read_array();
void display_array();
void read_array(int arr[])
{
int Size;
printf("Enter the desired size of the array: ");
scanf("%d", &Size);

for(int i = 0; i < Size; i++)
{
printf("nEnter a number for position %d:", i);
scanf("%d", &arr[i]);
getchar();
}
}
int main()
{
int size;
int arr[size];

read_array(arr[size]);

return 0;
}

关于数组的创建,您有3个选项(根据我自己的喜好排序(。

在这个例子中,get_array_size()是一个返回用户输入的元素数量的函数,process_array()对创建的数组做一些事情(比如用更多的用户输入填充它(。

1.(使用固定长度阵列

int array[10];
unsigned int size = get_array_size();
if (size > 10) {
printf("Size is too large.n");
exit(1);
}
process_array(array, size);

这样做的好处是,程序将消耗多少内存总是很清楚的:int大小的10个元素。

显然,如果用户输入的数字小于10(在本例中(,则数组的剩余部分将是"0";浪费";。

2.(在堆上分配数组

unsigned int size = get_array_size();
// It's still advised to "cap" the max. size of your array
if (size > 32) {
printf("Won't allocate: size is too large.n");
exit(1);
}
int *array;
array = calloc(size, sizeof(int));
if (!array) {
printf("Could not allocate memory!n")
exit(1);
}
process_array(array, size);
free(array);

注意free()函数的使用。

这里只分配需要/请求的内容(如果用户输入5,则只分配5元素(。

不利的一面是,一旦你用完了分配的内存,你就必须free()

即使在这里,也非常建议设置元素的最大数量(例如,你不希望你的程序为一个不需要的简单任务分配4GB的ram(

3.(在堆栈上分配阵列

unsigned int size = get_array_size();
// It's still advised to "cap" the max. size of your array
if (size > 32) {
printf("Won't allocate: size is too large.n");
exit(1);
}
int array[size];
process_array(array, size);

与选项2相同,只是使用后不free()内存。然而,其他限制也会发挥作用(你不能从函数中返回这样分配的数组(,你绝对不想让堆栈溢出。

所以你看,无论你选择哪个选项:实际上总是需要强制执行最大值,所以我会尽可能选择第一个选项(考虑堆栈大小(。

在所有情况下,process_array函数都可以用相同的方式实现(该函数不关心内存来自哪里(:

void process_array(int *array, unsigned int size) {
for (unsigned int i = 0; i < size; ++i) {
// do something with array[i]
}
}

底线是:如果你想用C语言编程,你必须理解这些概念。如果这对你来说太多了,请选择另一种为你处理内存的语言。

最新更新