您好我是新来的C编程新手。我运行此代码时收到Segmentation故障。如果1
我试图获取设定值的最大数量,案例2
我将我提供的数字加在一起,以防3
我正在记录输出骰子滚动,但我得到一个分段错误。我不知道在哪里看,因为错误没有给我一个问题的行号。
#include <stdio.h>
int ArrayMax(int arr[], int N) {
int i, Max = 0;
Max = arr[0];
for (i = 0; i < N; ++i) {
if (arr[i] > Max)
Max = arr[i];
}
return Max;
}
int ArrayAdd(int arr[], int N) {
int i, Sum;
Sum = 0;
for (i = 0; i < N; ++i) {
Sum = Sum + arr[i];
}
return Sum;
}
void DiceFill(int DR[], int many) {
int j;
for (j = 0; j < many; ++j) {
printf("You rolled: %d", DR[j]);
}
}
int main() {
int choice, DiceRoll, k, x, i, g, Max, Sum, Numb,
Numb2, Array[x], Array2[Numb2], MyArray[k];
do {
printf("\n");
printf("\n");
printf("------ Menu ------------\n");
printf("1) Find the maximum value in a set of numbers\n");
printf("2) Print the sum of a list of values. \n");
printf("3) Simulate many rolls of a standard dice.\n");
choice = -1;
while (choice < 0 || choice > 3) {
printf("Choice 0-14: ");
scanf("%d", &choice);
}
switch (choice) {
case 1:
printf("Type the # of elements you want to compare to get the largest value: ");
scanf("%d", &Numb);
for (x = 0; x < Numb; ++x) {
printf("Number %d is : ", x+1);
scanf("%d", &Array[x]);
}
Max = ArrayMax(Array, Numb);
printf("The largest value is %d", Max);
break;
case 2:
printf("Type the # of elements you want to add: ");
scanf("%d", &Numb2);
for (i = 0; i < Numb2; ++i) {
printf("Number %d is : ", i + 1);
scanf("%d", &Array2[i]);
}
Sum = ArrayAdd(Array2, Numb2);
printf("The Sum of the values is:%d", Sum);
break;
case 3:
srand(time(NULL));
printf("How many time do you want to roll a dice? ");
scanf("%d", &DiceRoll);
for (k = 0; k < DiceRoll; ++k) {
MyArray[k] = rand()% 6 + 1;
}
DiceFill(MyArray, DiceRoll);
break;
}
} while (choice > 0);
return 0;
}
答案 0 :(得分:2)
int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k];
中的第一行是
x
这会将int
保留为具有未定义值的整数(因为您没有初始化它);它可以是1,12345678或-654321 - 任何。在右边,您尝试声明Array[x]
数组(x
),该数组应该是该大小。这是根本原因。
根据x的(或多或少随机)值,此行可能仍然有效,但稍后会转储。
在C中,您需要在声明数组时声明数组的大小;它不会神奇地调整自己以适应int x=1000;
int choice,DiceRoll,k,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k];
变量。{/ p>
你应该使用你想要处理的最大数组大小来声明一个常量,或者作为一个快速的解决方案,在额外的行中拉出x的声明,然后赋值:
k
同样适用于Numb2
,<div class="cs-menu">
<div class="item item1">Link-one</div>
<div class="item item2">Link-two two</div>
<div class="item item3">Link-three three three</div>
等
答案 1 :(得分:0)
您在
中使用不确定索引int lastSpaceIndex = line.LastIndexOf(" ");
string subject = line.Substring(0, lastSpaceIndex);
string grade = line.Substring(lastSpaceIndex + 1);
声明Array
x
ans int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k];
&amp; Array2[Numb2]
。
标准表示未明确初始化的自动变量将具有不确定的值。
答案 2 :(得分:0)
数组具有不确定的大小,因为变量x,Numb2和k未初始化。
MyArray[k]
如果您的编译器支持可变长度数组,那么您可以在案例代码块中定义数组。例如
int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k];
您应该将变量声明为使用它们的最小范围。
答案 3 :(得分:0)
您正在使用变量的值声明数组,但您没有为这些变量获取任何值。如果该变量的垃圾值为负,则表示您正在尝试将负大小分配给不正确的数组,并且您将收到错误。首先将这些变量作为用户的输入,然后限制数组大小。
int i, a[1000], x; // set the initial size of array as a large value.
scanf("%d", &x);
for (i = 0; i < x; i++) { // then limit the size by the input you gave
scanf("%d", &a[i]);
}