Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 访问结构数组会导致分段错误_C_Arrays_Pointers_Struct_Malloc - Fatal编程技术网

C 访问结构数组会导致分段错误

C 访问结构数组会导致分段错误,c,arrays,pointers,struct,malloc,C,Arrays,Pointers,Struct,Malloc,我正在用一个键/值对数据类型实现一个哈希算法。我将字典存储为数据项数组。Imallocit,但是当我迭代通过刚才在inicializar_cerrada函数上分配的元素时,程序在第二次迭代时会出现故障 我和我的合伙人一直在努力解决这个问题,但问题仍然存在 SSCCE: #include <stdio.h> #include <stdlib.h> // ... #define TAM 11 typedef struct entrada_ { int ocupa

我正在用一个键/值对数据类型实现一个哈希算法。我将字典存储为数据项数组。I
malloc
it,但是当我迭代通过刚才在
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);   
}
#包括
#包括
// ...
#定义TAM 11
typedef struct entrada_{
国际奥库帕达;
炭屑[长屑];
"中国人",;
}恩特拉达;
typedef entrada*tabla_cerrada;
无效的非法交易(国际交易市场上的非法交易表){
int i;
对于(i=0;iocupada=0;
}
}
int main(){
表A_cerrada d=malloc(TAM*sizeof(entrada));
伊尼西奥·塞拉达(d&d,TAM);
}

你可以试试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);   
}
#包括
#包括
#定义纵向间隙30
#定义LONGITUD_SINONIMOS 300
#定义TAM 11
typedef struct entrada_{
国际奥库帕达;
炭屑[长屑];
"中国人",;
}恩特拉达;
typedef entrada*tabla_cerrada;
无效的非法交易(国际交易市场上的非法交易表){
int i;
对于(i=0;i
放下这个

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(tabla_cerrada diccionario,size_t tam){
对于(尺寸i=0;i
仍然
tabla_cerrada
不是一个“表”(又称数组),而是一个指针。正如我所说的,不要混淆你自己

  • diccionario
    参数的函数定义中删除星号<代码>tabla_cerrada
    已经是一个指针:

    void inicializar_cerrada(tabla_cerrada diccionario,inttam){

  • 将箭头符号更改为点符号。
    diccionario[i]
    是一个
    结构,而不是指向以下结构的指针:

    diccionario[i].ocupada=0;

  • 从函数调用中删除
    &
    d
    类型为
    tabla\u cerrada
    ,它是一个指针:

    inicializar_cerrada(d,TAM);


  • main
    函数中,创建结构对象的“数组”,而不是指向结构的指针数组(函数
    inicializar_cerrada
    将其视为)。不要因为键入指针类型而混淆自己。为什么
    tabla_cerrada*dicionario
    而不是
    tabla_cerrada dicionario
    ?因为你混淆了自己?;-)@Gerhardh,你的意思是
    (*dicionario)[i].ocupada
    。让函数取
    d
    ,而不是
    &d
    会更简单。我不能放弃那一行,它是项目规范的一部分。@tretrad:更新了我的答案。@alk不客气,先生,我们是你需要挑剔的额外的一双眼睛。:)只要
    在Ciializar_cerrada无效(Talla_cerrada*Dicionario,int 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);    
    }