C 利用结构数组分割故障

C 利用结构数组分割故障,c,struct,segmentation-fault,C,Struct,Segmentation Fault,我想用c语言编写一个排序程序。特别是桶类。无论如何,我将原始数组中的值输入到我的bucket(Canasta)结构中,无论我如何尝试,我都会得到一个分段错误。我也在这里读了另一个类似的问题,并尝试了它所说的,但它不起作用 构建:gcc sort.c-o sort 运行测试:$/排序5 为5必须创建的存储桶数 更新:我忘了在这一节中评论错误是在哪一行生成的。我添加了丢失的代码。谢谢。 错误行78:basket[numcan].entrada[acum[numcan]]=lista[i] 这是我的密

我想用c语言编写一个排序程序。特别是桶类。无论如何,我将原始数组中的值输入到我的bucket(Canasta)结构中,无论我如何尝试,我都会得到一个分段错误。我也在这里读了另一个类似的问题,并尝试了它所说的,但它不起作用

构建:gcc sort.c-o sort

运行测试:$/排序5

为5必须创建的存储桶数

更新:我忘了在这一节中评论错误是在哪一行生成的。我添加了丢失的代码。谢谢。

错误行78:
basket[numcan].entrada[acum[numcan]]=lista[i]

这是我的密码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define MAX 200
#define HOLGURA 50

typedef struct intervalo{
    int inf;
    int sup;
} Intervalo;

typedef struct canasta{
    Intervalo inter;
    int *entrada;
    int size;
} Canasta;

Canasta crearCanasta(Intervalo inter, int size){
    Canasta *basket = NULL;
    basket = (Canasta*)malloc(sizeof(Canasta));
    basket->entrada = malloc(size * sizeof(int));
    basket->inter = inter;
    return *basket;
}

int * generarLista(){
    static int lista[MAX];
    time_t t;
    /* Inicializa seed de rand() */
    srand((unsigned) time(&t));
    for(int i = 0; i < MAX; i++){
        lista[i] = rand() % 200; // Random de 0 a 999
        printf("lista: %d. ", lista[i]);
    }
    return lista;
}

int determinarCanasta(Intervalo * inter, int numhilos, int num){
    for(int i = 0; i < numhilos; i++){
        if(num > inter[i].inf && num < inter[i].sup)
            return i;
    }
}

Intervalo * crearIntervalo(int tamArr, int numhilos){
    Intervalo *aux = malloc(numhilos*sizeof(Intervalo));
    aux[0].inf = 0;
    aux[0].sup = tamArr + HOLGURA;
    for (int i = 1; i < numhilos; i++){
        aux[i].inf = tamArr*i + HOLGURA;
        aux[i].sup = tamArr*(i+1) + HOLGURA;
    }
    return aux;
}

int main(int argc, char const *argv[]){
    int *lista = generarLista();
    printf("Paso la generacion de lista\n");
    int salida[MAX];

    if(argv[1] > 0){
        int tamArr = MAX / atoi(argv[1]); // Tamaño maximo del arreglo
        Intervalo *inter = crearIntervalo(tamArr, atoi(argv[1])); // Arreglo de intervalos
        printf("Paso generacion de intervalos\n");
        Canasta *basket = malloc(atoi(argv[1]) * sizeof(Canasta)); // Arreglo de canastas
        printf("Paso asignacion de memoria de canastas\n");
        int numcan = 0;
        int acum[atoi(argv[1])];
        int array[atoi(argv[1])][tamArr + HOLGURA];

        for (int i = 0; i < atoi(argv[1]); i++){
            basket[i] = crearCanasta(inter[i], atoi(argv[1]));
            acum[i] = 0;
        }
        
        for(int i = 0; i < MAX; i++){
            numcan = determinarCanasta(inter, atoi(argv[1]), lista[i]);
            basket[numcan].entrada[acum[numcan]] = lista[i]; // This line makes the error
            printf("%d. ", numcan);
            // I also tried to make an auxiliary bidimensional array to store the values but I get the same error
            //array[numcan][acum[numcan]] = lista[i];
            acum[numcan]++;
        }

        printf("Paso determinacion de canasta\n");
    
    }
    else{
        printf("ERROR: Ingresa un numero valido de canastas");
        exit(0);
    }
}
#包括
#包括
#包括
#定义最大值200
#定义HOLGURA 50
类型定义结构间隔{
int-inf;
内部监督;
}间歇期;
类型定义结构canasta{
间隔期;
int*entrada;
整数大小;
}卡纳斯塔;
Canasta crearCanasta(国米区间,国际码){
Canasta*basket=NULL;
篮子=(Canasta*)马洛克(sizeof(Canasta));
篮子->夹带=malloc(尺寸*sizeof(int));
篮下->国米=国米;
返回*篮子;
}
int*generalista(){
静态int lista[MAX];
时间;
/*伊尼亚利扎种子德兰德()*/
srand((未签名)时间(&t));
对于(int i=0;iinter[i].inf&&num0){
int tamArr=MAX/atoi(argv[1]);//Tamaño maximo del arreglo
Intervalo*inter=crearIntervalo(tamArr,atoi(argv[1]);//Arreglo de intervalos
printf(“间隔时间的一般规则”);
Canasta*basket=malloc(atoi(argv[1])*sizeof(Canasta));//Arreglo de canastas
printf(“加拿大记忆协会”);
int numcan=0;
int acum[atoi(argv[1]);
int数组[atoi(argv[1])][tamArr+HOLGURA];
对于(inti=0;i

我非常感谢任何帮助:)

从我在代码中看到的,当
determinarcanata
函数在迭代中从未返回
I
值时,就会发生段故障。很难理解您期望的行为是什么,但是如果您更改为
if(num>=inter[i].inf&&num=inter[i],它会正确地找到一个间隔.inf&&num从我在代码中看到的情况来看,当
determinarcanata
函数在迭代中从未返回
i
值时,就会发生段错误。很难理解您期望的行为是什么,但是如果(num>=inter[i],则如果更改为
,它会正确地找到间隔。inf&&num=inter[i].inf&&num执行基本调试。使用调试器。它将立即准确地告诉您哪行代码触发seg故障。这是您自己应该知道并在问题中发布的最低信息。调试器还可用于单步执行代码并在代码运行时检查它。请继续调试。例如,您是否查看了值当崩溃发生时,
numcan
acum[numcan]
的值是什么,它们是否在各自数组的范围内?对于basket[numcan]的任何值,它都会崩溃,我甚至尝试过做类似于
basket[0]的事情。entrada[acum[numcan]=lista[I]
它是有效的,但显然我需要将每个数字都放入正确的存储桶中。我确信我已经为struct
basket
数组保留了内存,因此我对这个错误非常担心。此外,我还检查了
确定arcanata()的值
numcan返回值正常。进行基本调试。使用调试器。它会立即准确地告诉您哪一行代码触发seg故障。这是您自己应该知道并在问题中发布的最低信息。调试器还可用于单步调试代码并在运行时检查代码。请继续调试。例如,did当崩溃发生时,您可以查看
numcan
acum[numcan]
的值。它们是什么值?它们是否在各自数组的范围内?对于basket[numcan]的任何值,它都会崩溃,我甚至尝试过做类似
basket[0]的事情。entrada[acum[numcan]=lista[I]
它是有效的,但显然我需要将每个数字都放入正确的存储桶中。我确信我已经为struct
basket
数组保留了内存,因此我对这个错误非常担心。此外,我还检查了
确定arcanata()的值
numcan的退货没问题。非常感谢您的支持,我已经更改了
d
int determinarCanasta(Intervalo * inter, int numhilos, int num){
    for (int i = 0; i < numhilos; i++) {
        if (num >= inter[i].inf && num <= inter[i].sup)
            return i;
    }
    // return some value
    return DEFAULT_VALUE;
}