为什么c字符串被释放?

时间:2012-01-12 13:22:07

标签: c

不熟悉C,请纠正我的任何错误。

这里有一些代码:

void db_cstr(char* cstr, int len) {
    char* temp2 = cstr;
    cstr = (char*)malloc(len*2*sizeof(char));
    // print 1
    printf(cstr);
    printf("\n");
    //print 2
    printf(temp2);
    printf("\n");
    strcpy(cstr, temp2);
    //free
    free(temp2);
    //print 3
    printf(cstr);
}
int somefunction(){
    int array_len = 10;
    char* cmd = (char*)malloc(array_len*sizeof(char));
    strcpy(cmd, "apple");
    db_cstr(cmd, array_len);
    // final print
    printf(cmd);
    return 1;
}

我的值(总是)为// print 1 ==“”和// print 2 ==“apple”和// print 3 ==“apple”。但是,当我进行最终打印时,printf什么都不打印。我认为这与free(temp2)有关;所以当我评论它时,最终的印刷品是“苹果”。我相信这是因为某些函数中的orignal cmd指针仍然指向temp2处的释放数组。如何使cmd指针指向新cstr在db_cstr中指向的内容。 (我不希望db_cstr返回任何内容。)

6 个答案:

答案 0 :(得分:3)

以下free()s来电者的cmd

char* temp2 = cstr;
free(temp2);

因此,最终的printf()正在尝试打印已经被释放的内存,这是未定义的行为。

使db_cstr()返回新指针的最简单方法是这样:

char* void db_cstr(char* cstr, int len) {
    ...
    printf(cstr);
    return cstr;
}

int somefunction(){
    ...
    cmd = db_cstr(cmd, array_len);
    ...
}

通过将db_cstr()的第一个参数转换为指向指针(char**)并适当地更改代码,可以实现类似的效果。

答案 1 :(得分:2)

如果你想要一个函数来改变一个var,你应该传递一个指向它的指针。即使var是指针也是如此。

所以:void db_cstr(char** cstr, int len)db_cstr(&cmd, array_len);等等......

<顺便说一句,不要直接在var上使用printf。请改用printf("%s",cmd)

答案 2 :(得分:1)

您应该返回新指针。但是你没有动力地说,你不“想”回报任何东西。所以,我猜你需要让参数成为指向指针的指针,这样你就可以在函数中改变调用者的指针:

void db_cstr(char **cstr, size_t len);

答案 3 :(得分:0)

在您的情况下,请勿使用printfputs。如果您在没有附加参数的情况下将"a%sx%d"传递给printf,那么您的程序会有未定义的行为并且会崩溃。

学习使用调试器,并打印所涉及字符串的地址。例如,您可以在几个地方放置类似于

的语句
fprintf(stderr, "at %s:%d cstr=%p\n", __FILE__, __LINE__, cstr);

当然用可能更合适的变量名替换cstr两次。

答案 4 :(得分:0)

最简单的方法是从函数返回新内存,而不是试图通过指针返回它。

char* db_cstr(char* cstr, int len) {
    char* result = malloc(len);
    strcpy(result, cstr);
    free(cstr);
    return result;
}

然后你会这样称呼:

cmd = db_cstr(cmd, array_len);

答案 5 :(得分:0)

更改cmd指向的地址的唯一方法是将指向cmd的指针传递给db_cstr。

所以你需要重写这样的代码:

void db_cstr(char** cstr, int len) {
    char* temp2 = *cstr;
    *cstr = (char*)malloc(len*2*sizeof(char));
    strcpy(*cstr, temp2);
    free(temp2);
}
int somefunction(){
    int array_len = 10;
    char* cmd = (char*)malloc(array_len*sizeof(char));
    strcpy(cmd, "apple");
    db_cstr(&cmd, array_len);
    // final print
    printf(cmd);
    return 1;
}

看看db_cstr(&cmd, array_len);你在这里传递指针指针。