运行这段代码时遇到问题:在free
的{{1}}指令中出现的分段错误。我找不到问题。
percorso
void ricerca(char nome[], struct node *radice, char percorso[], struct stringhe **indice) {
struct node *punt = radice;
int dim = len(percorso);
char *prov = NULL;
if (dim > 0) {
prov = malloc(2 * dim * sizeof(char));
prov[0] = '\0';
strcpy(prov, percorso);
free(percorso); //--------------------->here the SegFault
}
struct stringhe *nuovo = NULL;
int i = 0, fine = 0;
char *perc_orig = NULL;
if (punt != NULL) {
if (punt->array != NULL) {
dim = len(prov) + len(punt->nome) + 2;
percorso = malloc(dim * sizeof(char));
percorso[0] = '\0';
if (prov!=NULL)
strcpy(percorso, prov);
strcat(percorso, "/");
strcat(percorso, punt->nome);
perc_orig = malloc(dim * sizeof(char));
for (i = 0; i < N; i++) {
if (punt->array->vet[i] != NULL) {
perc_orig[0] = '\0';
strcpy(perc_orig, percorso);
ricerca(nome, punt->array->vet[i], perc_orig,indice);
}
}
free(perc_orig);
}
if (strcmp(nome,punt->nome) == 0) {
free(percorso);
dim = len(prov) + len(punt->nome) + 2;
percorso = malloc(dim * sizeof(char));
inizializza(percorso, dim);
if (prov != NULL)
strcpy(percorso, prov);
strcat(percorso, "/");
strcat(percorso, punt->nome);
nuovo = malloc(sizeof(struct stringhe));
nuovo->next = NULL;
nuovo->str = malloc(dim * sizeof(char));
inizializza(nuovo->str, dim);
strcpy(nuovo->str, percorso);
nuovo->next = (*indice);
*indice = nuovo;
}
while (punt->chain != NULL && fine == 0) {
ricerca(nome, punt->chain,prov, indice);
fine = 1;
if (prov!=NULL)
free(prov);
}
}
}
功能与len
类似,但不同之处在于我自己创作了。
上下文是:
strlen
数据结构:
void find(char nome[], struct node *radice) {
char *perc = NULL;
struct stringhe **inizio = NULL;
inizio = malloc(sizeof(struct stringhe*));
*inizio = NULL;
int i = 0;
for (i = 0; i < N; i++) {
if (radice->array->vet[i] != NULL) {
perc = NULL;
ricerca(nome, radice->array->vet[i], perc, inizio);
}
}
if (*inizio != NULL) {
insertion(inizio);
stampap(*inizio);
} else
printf("no\n");
}
答案 0 :(得分:1)
这真的很奇怪:
if (some condition)
free(percorso);
稍后我们有:
perc_orig = malloc(dim*sizeof(char));
for(something){
if(something){
ricerca(nome,punt->array->vet[i],perc_orig,indice);
}
}
free(perc_orig);
如果情况发生,perc_orig将被释放两次。 KABOOM。
我认为您的问题是您认为ricerca(..., char percico[], ...)
复制了percico。它没有;它真的是ricerca(..., char *percico, ...)
所以你最终释放了两次内存。
答案 1 :(得分:0)
char数组的大小调整需要允许尾随NUL(&#39; \ 0&#39;)字符。
strcpy()
引用的所有字段和类似函数都需要终止所有源字符数组NUL。
代码似乎没有为那些尾随NUL字节分配足够的空间NOR使用NUL字符终止每个字符数组。
答案 2 :(得分:-2)
将字符指针初始化为NULL
并尝试将其指向非空值时,会发生分段错误
例如,
char *a=NULL;
a='a';
会导致分段错误。为避免这种情况,您可以尝试初始化为,
char *a;
a='a';