我无法存储用户输入的每个阵列的大小。我需要这样做,以便我可以在每个集合上运行不同的计算。这就是我现在要做的,但它不断抛出一个分段错误,我不知道我做错了什么。我想做的另一件事实际上是使用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语句只是我试图确保事情正在做他们应该做的事情。如果您需要我提供更多信息,请与我们联系。感谢。
答案 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;
}