数组长度,单位为C.

时间:2016-03-28 06:09:10

标签: c arrays

我是编码的新手,所以如果这是一个愚蠢的问题,我道歉。我正在向数组写入值,使得数组中的位置对应于值,使得数组中的第一个位置为1,数组中的第二个位置为2,数组中的第n个位置具有值n。此代码一直有效,直到您输入8。

#include <stdio.h> 

int a = 0, b = 0;

int main(void){  
    int die[b];
    printf("Input how many sides your die has \n");
    scanf("%i", &b);    
    for(a = 1; a <= b; a++){
        die[a] = a;
    }    
    for(a = 1; a <= b; a++){
        printf("%i  ", die[a]);
    }
}

但是,此代码适用于输入的任何值....

#include <stdio.h>

int a = 0,b = 0;

int main(void){
    printf("Input how many sides your die has \n");
    scanf("%i", &b);
    int die[b];
    for(a = 1; a <= b; a++){
        die[a] = a;
    } 
    for(a = 1; a <= b; a++){
        printf("%i  ", die[a]);
    }
}

我的问题是为什么更改scanf的位置,以及数组的声明会改变代码的工作方式?

7 个答案:

答案 0 :(得分:3)

两个代码示例都会导致未定义的行为。数组索引应从0开始。你的循环应该是这样的:

for(a=0; a < b; a++){

在您的第一个代码示例中,int die[b]; b被初始化为0.它仅在scanf之后被初始化为用户定义的输入。

int的格式说明符也是%d

答案 1 :(得分:1)

以上所有答案都已经告诉您,您的代码导致了未定义的行为。将进一步澄清事情。 基本上你的数组是一个静态大小的局部变量。所以它将在堆栈上分配。所以当你说int arr [b]而b在编译时为零时,arr [0]被分配在堆栈上。 scanf在运行时工作。所以当你扫描一个'b'中的值时,它不会返回堆栈并调整数组的大小。因此,如果您需要动态数组,即在运行时分配数组,则代码可能会为您提供最佳服务。

int a = 0, b = 0;
int main()
{
 int* arr = NULL;
 printf("How many sides does your dice has?\n");
 scanf("%d", &b);

 arr = malloc(sizeof(int)*b);

 for(a = 0; a < b; a++)
 {
  arr[a] = a;
 }
}

答案 2 :(得分:0)

第一个代码实际上会导致未定义的行为。原因是您将全局变量pattern = /domain\.com\/go\/(\w*)3\b/i; 初始化为b,然后在 读取之前创建本地数组0 来自用户的值。实际上,您的数组是使用值die[b]0创建的,它将被声明为b,换句话说,它是一个大小为die[0]的数组。 (实际上即使您使用0阅读b,这也是与您声明的全局scanf()不同的变量。)

在第二个代码中,您不需要全局变量b。将其设置为本地,并像用户一样从用户那里阅读。

  • 此外,在打印整数时,请使用说明符b
  • 最后,开始从%d开始索引数组,而不是从0
  • 开始

答案 3 :(得分:0)

是的,scanf的位置会改变代码的行为,因为b的第一个代码值将为0,这就是为什么你的数组会像die[0]一样初始化的原因用户输入b的第二个代码值,这就是为什么数组将根据用户值进行初始化。

答案 4 :(得分:0)

数组索引从0开始,而不是1

您可以像这样在数组中输入值。

for( a = 0; a < b; a++ ) {
    die[a] = a;
}

你以类似的方式从数组中获取输出。

答案 5 :(得分:0)

int die[b];

printf("Input how many sides your die has \n");
scanf("%i",&b); 

这里,最初 b 为0.所以你声明大小为0的数组。它实际上是未定义的行为。但是,

printf("Input how many sides your die has \n");
scanf("%i",&b);


int die[b];

在这里,您首先获取 b 的值。然后声明 b 的大小数组。但仍然会显示未定义的行为,因为您尝试访问 die [b] ,您有权从 die [0] 访问 die [b-1] (总b大小)。

答案 6 :(得分:0)

在声明变量时,应始终考虑范围。您可以尝试以下几点:

  1. 变量ab应该是局部变量。

  2. 您必须了解C中的动态内存分配。我可以看到scanf()之后您要创建一个扫描大小的数组。这是动态内存分配的用例。因此,您需要使用malloc来分配所需大小的数组。

  3. 应用这些修补程序后,您的程序将摇滚:)并且不要忘记free内存 - 作为一个很好的编程实践。