0

我有以下代码:

char *get_packet(int cc, char *args[]){

    char *packet;
    packet = (char*) malloc(30 * sizeof(char));

    //other code..

    ...

    return packet;
}

int main(){

    int cc = SCANS_TO_ACCUMULATE;
    int args[] = {5000};

    char *str_args[15];
    int i = 0;
    for(i; i<((sizeof(args)/sizeof(args[0]))); i++){
           char buffer[10];
           sprintf(buffer, "%d", args[i]);
           str_args[i] = strdup(buffer);
           free(buffer);
    }
    str_args[i] = NULL;

    char *pkt;
    pkt = get_packet(cc, str_args);
    printf("%s\n", pkt);
    free(pkt);
    pkt = NULL;
    getchar();

    return 0; 
}

但是,运行它会导致我的程序立即崩溃,并且在与 Dr. Memory 进行了一些检查后,我似乎有内存泄漏,但我似乎无法找到它发生的原因。我没有正确释放 malloc 的内存吗?提前致谢

4

3 回答 3

4

您的代码尝试释放buffer未动态分配的内存,即局部变量数组。这会导致崩溃。

于 2013-11-03T21:03:12.993 回答
3

这里:

char buffer[10];
...
free(buffer);

您不能释放本地数组,删除对free. 当变量超出范围时,内存将自动释放。

于 2013-11-03T21:03:04.200 回答
0

释放本地数组“缓冲区”是未定义的,可能是可怕的行为!除非它是用 malloc() 或 calloc() 分配的,否则你不能释放它。它可能会破坏堆并导致崩溃。

于 2013-11-03T21:04:27.180 回答