分段错误:双重自由或损坏(快速顶部)

时间:2017-09-05 14:53:20

标签: c segmentation-fault

运行这段代码时遇到问题:在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");
}

3 个答案:

答案 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';