无法存储我在C中拥有的每个数组的大小

时间:2014-09-27 05:54:04

标签: c arrays pointers

我无法存储用户输入的每个阵列的大小。我需要这样做,以便我可以在每个集合上运行不同的计算。这就是我现在要做的,但它不断抛出一个分段错误,我不知道我做错了什么。我想做的另一件事实际上是使用malloc创建一个更多的内存点,并将大小存储在数据集数组末尾的另一个数组中。无论如何,这是给我一个分段错误的代码。

int construct_data_sets(int *sets[], int count) {
    int set_size;
    int j;
    j = 0;
    printf("Enter the number of elements in data set %d: ", count+1);
    scanf(" %d", &set_size);
    sets[count] = (int*)malloc((sizeof(int) * set_size));
    if (sets[count] == NULL){
        printf("Malloc failed!\n");
    }
    printf("Enter the data for set %d: ", count+1);
    while ((j + 1) <= set_size)
    {
        scanf(" %d", &sets[count][j]);
        j++;
    }
    return set_size;
}

这是主要的,我认为当我调用construct_data_sets()时会引发分段错误。

int main() {
    int command = 0, data_set, set_desired, array_size;
    int number = prompt_num_sets();
    int *sets[number], i = 0, *sizes[number];
    while (i < number)
    {
        array_size = construct_data_sets(sets, i);
        *sizes[i] = array_size;
        i++;
    }
    //printf("The size of the 3rd data set is %d", *sizes[3]);
    printf("Data at [data_set][1] = %d\n", sets[data_set-1][1]);
    set_desired = select_data_set(number);
    while (command != 7) {
        printf("Choose what you would like to do:\n");
        printf("1. Find the minimum value.\n");
        printf("2. Find the maximum value.\n");
        printf("3. Calculate the sum of all the values.\n");
        printf("4. Calculate the average of all the values.\n");
        printf("5. Sort the values in ascending order.\n");
        printf("6. Select a different data set.\n");
        printf("7. Exit the program.\n");
        scanf(" %d", &command);

        if (command == 7) {
            exit_program();
        } else if (command == 6) {
            change_term(number, sets);
        }
        printf("====================================\n");
    }
}

你可能看到的任何奇怪的printf语句只是我试图确保事情正在做他们应该做的事情。如果您需要我提供更多信息,请与我们联系。感谢。

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误以及一些风格问题。您是否尝试在调试器中运行代码以确切地查看崩溃的位置?您是否尝试将代码缩小到较小的问题?

您的sizes数组的元素类型应为int,而不是int *。您正在取消引用未初始化的内存,因为您尚未为指针分配任何内容。您的data_set变量也未初始化,因此对sets的数组访问也未定义。

您应该在定义后立即初始化所有变量。此外,我会更改您的代码,以声明每个语句只有一个变量。目前的代码很难阅读。

我还会将您的初始while循环更改为for循环。

这是一个不会崩溃的工作版本;虽然,由于您还没有包含所有代码,我不知道是否有其他部分被破坏。我还必须删除对未定义函数的引用:

#include <stdio.h>
#include <stdlib.h>

int construct_data_sets(int *sets[], int count) {
    int set_size;
    int j;
    printf("Enter the number of elements in data set %d: ", count+1);
    scanf(" %d", &set_size);
    sets[count] = (int *) malloc((sizeof(int) * set_size));
    if (sets[count] == NULL) {
        fprintf(stderr, "Malloc failed!\n");
        exit(-1);
    }
    printf("Enter the data for set %d: ", count+1);
    for (j = 0; j < set_size; ++j) {
        scanf(" %d", &sets[count][j]);
    }
    return set_size;
}

int main(int argc, char *argv[]) {
    int command = 0;
    int number = 1;
    int *sets[number], i, sizes[number];
    for (i = 0; i < number; ++i) {
        sizes[i] = construct_data_sets(sets, i);
    }
    printf("Data at [0][1] = %d\n", sets[0][1]);
    while (command != 7) {
        printf("Choose what you would like to do:\n");
        printf("1. Find the minimum value.\n");
        printf("2. Find the maximum value.\n");
        printf("3. Calculate the sum of all the values.\n");
        printf("4. Calculate the average of all the values.\n");
        printf("5. Sort the values in ascending order.\n");
        printf("6. Select a different data set.\n");
        printf("7. Exit the program.\n");
        scanf(" %d", &command);

        if (command == 7) {
            return 0;
        } else if (command == 6) {
            return 0;
        }
        printf("====================================\n");
    }
    return 0;
}