存取结构数组会产生分段错误

时间:2019-01-14 12:53:31

标签: c arrays pointers struct malloc

我正在实现具有键/值对数据类型的哈希算法。我将字典存储为数据条目的数组。我malloc,但是当我遍历刚刚在inicializar_cerrada函数上分配的元素时,在第二次迭代时出现程序段错误。

我和我的合作伙伴一直在努力解决这一问题,但问题仍然存在。

SSCCE:

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

// ...

#define TAM 11

typedef struct entrada_ {
    int ocupada;
    char clave [LONGITUD_CLAVE];
    char sinonimos [LONGITUD_SINONIMOS];
} entrada;

typedef entrada *tabla_cerrada;

void inicializar_cerrada(tabla_cerrada *diccionario, int tam) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%d\n", i);
        diccionario[i]->ocupada = 0;
    }
}

int main() {
    tabla_cerrada d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(&d, TAM);   
}

3 个答案:

答案 0 :(得分:1)

  1. diccionario参数的函数定义中删除星号。 tabla_cerrada已经是一个指针:

    void inicializar_cerrada(tabla_cerrada diccionario, int tam) {

  2. 将箭头符号更改为点符号。 diccionario[i]struct,而不是指向一个的指针:

    diccionario[i].ocupada = 0;

  3. 从函数调用中删除&d的类型为tabla_cerrada,它是一个指针:

    inicializar_cerrada(d, TAM);

答案 1 :(得分:0)

@Gerhardh commented

  

您可以尝试diccionario [i]-> ocupada =>(* diccionario)[i] .ocupada

效果很好!

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

#define LONGITUD_CLAVE 30
#define LONGITUD_SINONIMOS 300
#define TAM 11

typedef struct entrada_ {
    int ocupada;
    char clave [LONGITUD_CLAVE];
    char sinonimos [LONGITUD_SINONIMOS];
} entrada;

typedef entrada *tabla_cerrada;

void inicializar_cerrada(tabla_cerrada *diccionario, int tam) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%d\n", i);
        (*diccionario)[i].ocupada = 0;
    }
}

int main() {
    tabla_cerrada d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(&d, TAM);   
}

答案 2 :(得分:0)

丢弃此

typedef entrada *tabla_cerrada;

然后做

void inicializar_cerrada(entrada *diccionario, int tam) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%d\n", i);
        diccionario[i].ocupada = 0;
    }
}

int main(void) {
    entrada * d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(d, TAM);    
}

甚至是保护程序:

void inicializar_cerrada(entrada *diccionario, size_t tam) {
    for (size_t i = 0; i < tam; ++i) {
        printf("%zu\n", i);
        diccionario[i].ocupada = 0;
    }
}

int main(void) {
    entrada * d = malloc(TAM * sizeof *d);  
    inicializar_cerrada(d, TAM);    
}

如果您被迫使用

typedef entrada *tabla_cerrada;

void inicializar_cerrada(tabla_cerrada diccionario, size_t tam) {
    for (size_t i = 0; i < tam; ++i) {
        printf("%zu\n", i);
        diccionario[i].ocupada = 0;
    }
}

int main(void) {
    tabla_cerrada d = malloc(TAM * sizeof *d);  
    inicializar_cerrada(d, TAM);    
}

仍然tabla_cerrada不是“表”(也称为数组),而是指针。如我所说,不要混淆自己。