这里是C的新手,如果我能得到一些指示,我将不胜感激。
我正在尝试在if语句中初始化一个数组,然后在外部打印数组的值 - 但我知道在if块结束后范围将丢失。我试过用指针创建数组。我在if语句中执行此操作的原因是因为数组的大小取决于在运行时计算的值。
E.g:
void createArray() {
int userInput;
printf("%s\n", "Please enter a value:");
scanf("%d\n", userInput);
if (userInput > 10) {
int array[userInput];
}
int i;
for (i = 0; i < userInput; i++) {
array[i] = i;
}
}
int i;
for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) {
printf("%d\n", array[i]);
}
但是因为数组是在方法中声明的,所以当涉及到最终的for循环打印时,我显然会失去它的范围 - 因此会发生错误。我尝试创建一个指针变量int *array
作为全局变量,并在if语句中,只停留array = int [10],但显然这不起作用。
这不是我的确切代码,我重新创建了一个显示我的错误的最小示例,因此这里的某些语法可能有误 - 为此道歉。
任何帮助都将不胜感激。
答案 0 :(得分:3)
您的代码中必须考虑的一个问题是,如果userInput小于或等于10,会发生什么?您迭代未声明的数组的userInput元素。
处理此问题的一种简单方法是在函数开头创建一个大数组,然后只使用它的第一个userInput元素。这种方法显然有其局限性(例如,userInput不能大于数组的大小,你应该确保它不会,否则可能会发生坏事),但很简单。
另一种方法涉及使用动态内存分配。这是通过使用malloc
函数完成的:
int *array = malloc(100 * sizeof(int));
上面的代码为100个int分配内存,基本上创建了一个包含100个元素的数组。然后,您可以像往常一样使用该数组。但是,请确保在完成后将其释放:
free(array);
请注意,使用此方法您需要先声明指针:
int *array;
if (userInput > 10) {
array = malloc(userInput * sizeof(int));
}
下面你可以找到一个小概念验证程序。请注意,可以从alloc函数返回指针值而不是全局变量。
#include <stdio.h>
#include <stdlib.h>
int *arr;
void alloc() {
arr = malloc(10 * sizeof(int));
}
void assign() {
for (int i = 0; i < 10; i++)
arr[i] = i + i;
}
void print() {
for (int i = 0; i < 10; i++)
printf("%d\n", arr[i]);
}
int main(int argc, char *argv[])
{
alloc();
assign();
print();
free(arr);
return 0;
}
答案 1 :(得分:3)
这会将int数组分配给指针intary。指针可以从main()
传递给其他函数。在main中,userInput存储分配的int数。
#include <stdio.h>
#include <stdlib.h>
int *createArray( int *userInput);
int main( int argc, char *argv[])
{
int i;
int userInput = 0;
int *intary = NULL;
if ( ( intary = createArray ( &userInput)) != NULL ) {
for (i = 0; i < userInput; i++) {
intary[i] = i;
printf ( "%d\n", intary[i]);
}
free ( intary);
}
return 0;
}
int *createArray( int *userInput) {
int *array = NULL;
printf("%s\n", "Please enter a value:");
scanf("%d", userInput);
if ( *userInput > 10) {
if ( ( array = malloc ( *userInput * sizeof ( int))) == NULL) {
printf ( "could not allocate memory\n");
*userInput = 0;
return NULL;
}
}
else {
*userInput = 0;
return NULL;
}
return array;
}
答案 2 :(得分:1)
你不需要一些指针,只需要一个,(int * arr)和malloc(),一个动态内存分配函数。
注意:你不应该使用&#34; array&#34;作为变量名称,因为它可能会产生问题。所以我们将变量命名为arr。
如果您不熟悉它,我也会解释代码。
首先添加#include <stdlib.h>
头文件,其中包含malloc()。
然后声明一个int int* arr
类型的指针,我们在createArray()范围内将其命名为arr。
我们将使用malloc()函数分配if条件中所需的空间,如:
void createArray() {
int userInput;
int* arr; // declare arr pointer
printf("%s\n", "Please enter a value:");
scanf("%d\n", userInput);
if (userInput > 10) {
arr = (int*) malloc ( userInput * sizeof(int) ); // explained below
}
int i;
for (i = 0; i < userInput; i++) {
arr[i] = i;
}
}
free(arr) // don't forget to free after using
[注意]此代码未经测试。
arr =(int *)malloc(userInput * sizeof(int));
这行看起来可能看起来很神秘,但它的作用非常简单,它在堆上动态分配一些内存
这个内存的大小由&#39; userInput * sizeof(int)&#39;给出,sizeof()函数指定给定机器上int的大小乘以userInput由用户,
然后,它被类型化为int *类型,以便我们可以将地址存储在我们的int *类型指针arr中。
[更新]您可以根据评论中的建议使用arr = malloc ( userInput * sizeof(int) );
,这就是为什么Do I cast the result of malloc?