分段错误错误。 C编程

时间:2016-07-24 13:45:36

标签: c

您好我是新来的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;
}

4 个答案:

答案 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]);
}