我是编码的新手,所以如果这是一个愚蠢的问题,我道歉。我正在向数组写入值,使得数组中的位置对应于值,使得数组中的第一个位置为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的位置,以及数组的声明会改变代码的工作方式?
答案 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)
在声明变量时,应始终考虑范围。您可以尝试以下几点:
变量a
和b
应该是局部变量。
您必须了解C中的动态内存分配。我可以看到scanf()
之后您要创建一个扫描大小的数组。这是动态内存分配的用例。因此,您需要使用malloc
来分配所需大小的数组。
应用这些修补程序后,您的程序将摇滚:)并且不要忘记free
内存 - 作为一个很好的编程实践。