C 访问结构数组会导致分段错误
我正在用一个键/值对数据类型实现一个哈希算法。我将字典存储为数据项数组。IC 访问结构数组会导致分段错误,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
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);
}