【问题标题】:Segmentation fault using arrays of structs使用结构数组的分段错误
【发布时间】:2021-02-07 16:25:02
【问题描述】:

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

构建:gcc sort.c -o sort

运行测试:$ ./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);
    }
}

如果有任何帮助,我将不胜感激:)

【问题讨论】:

  • 进行基本调试。使用调试器。它会立即准确地告诉您哪一行代码触发了段错误。这是您应该自己了解并在问题中发布的最少信息。调试器还可用于单步调试代码并在运行时对其进行检查。
  • 继续调试。例如,当崩溃发生时,您是否查看了numcanacum[numcan] 的值?它们是什么值,它们是否在各自数组的范围内?
  • 它对于任何值的 basket[numcan] 都会崩溃,我什至尝试过类似basket[0].entrada[acum[numcan]] = lista[i] 的操作,但它确实有效,但显然我需要将每个数字放入正确的存储桶中。我确定我已经为struct basket 的数组保留了内存,所以我对这个错误感到非常困惑。另外,我检查了determinarCanasta() 为 numcan 返回的值是否正常。

标签: c struct segmentation-fault


【解决方案1】:

从我在代码中看到的,当determinarCanasta 函数在迭代中从不返回i 值时,就会发生段错误。很难理解您期望什么行为,但是如果您更改为 if (num &gt;= inter[i].inf &amp;&amp; num &lt;= inter[i].sup)(使用 &lt;=&gt;=),它将正确找到一个间隔。另一种解决方案是定义在这种情况下要返回的默认值。

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;
}

【讨论】:

  • 非常感谢 GustavoBiage,考虑到间隔的缺失值,我已经更改了 determinarCanasta() 函数。我摆脱了分段错误。离开条件如下:if(num &gt;= inter[i].inf &amp;&amp; num &lt; inter[i].sup)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多