释放无效指针?

时间:2015-09-05 17:21:15

标签: c segmentation-fault malloc free dynamic-memory-allocation

python manage.py makemigration
python manage.py migrate

我的输出:

void resolve_paths(char* inputdir)
{
    char** tokens = malloc(64*sizeof(char*));
    char* ptr;
    char* slash = "/";
    int i = 0;

    ptr = strtok(inputdir,slash);
    while(ptr != NULL){
        if(strcmp(ptr,"~") == 0){
            ptr = getenv("HOME");
        }
        tokens[i] = (char*)calloc(64,sizeof(char));
        tokens[i] = ptr;
        printf("token[%i] = %s\n",i,tokens[i]);

        i++;
        ptr = strtok(NULL,slash);
    }
    int j;
    printf("freeing each element of tokens\n");
    for(j = 0; j < i; j++){
        printf("freeing token[%i]\n",j);
        free(tokens[j]);
    }
    free(tokens);
    puts("leaving resolve_paths\n");
    return;
}

我想我根本不明白malloc / calloc和free的工作方式。为什么这段代码会遇到段错误?

3 个答案:

答案 0 :(得分:2)

tokens[i] = ptr;你的错误。您正在分配一个指针,而不是(正如您所料)将字符串复制到已分配的内存中,因此您可以释放以后未实际分配的内容。

你必须使用strcpy / strncpy将ptr复制到标记[i]。使用类似strncpy(tokens[i],ptr,63)而不是tokens[i] = ptr;的内容。

答案 1 :(得分:0)

至于回答malloc()calloc()的工作方式,请转到此处:How do malloc() and free() work?, 你问题的优秀答案。

答案 2 :(得分:0)

tokens[i] = (char*)calloc(64,sizeof(char));
tokens[i] = ptr;

此代码不符合您的想法。首先分配64个字节并将地址存储在tokens[i]中,然后用ptr替换该地址(从而丢失刚刚分配的泄漏的地址)。

可能你的意思是

tokens[i] = calloc(64,sizeof(char));
strncpy(tokens[i], ptr, 64);

分配内存,然后将ptr指向的字符串复制到其中。请注意,您不需要在C中强制转换calloc或malloc的结果,因为void*可以隐式转换为任何其他指针。

最后,您尝试free(tokens[i]),但所包含的地址只是由inputdir调整的strtok的本地地址,因此它不是您可以正确释放的动态分配地址,这就是你得到错误的原因。