2012-01-12 81 views
2

不熟悉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; 
} 

我的价值观(永远)//打印1 == “” 和//打印2 == “苹果” 和//打印3 == “苹果”。但是,当我做最后的打印时,printf什么都不打印。我认为这与免费(temp2)有关;所以当我评论它最后的印刷品是“苹果”。我相信这是因为某些函数中的orignal cmd指针仍然指向temp2中释放的数组。你如何让cmd指针指向新的cstr在db_cstr中指向的内容。 (我不希望db_cstr返回任何东西)。

+1

'somefunction'中的最后一个'printf'可以打印任何东西,包括垃圾,因为'cmd'在'db_cstr'中被释放。你在'db_cstr'中也有内存泄漏,因为你没有释放你在那个函数中分配的内存。 – 2012-01-12 13:27:38

回答

2

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

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

顺便说一下,不要直接printf的一个变种使用。改为使用printf("%s",cmd)

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

您应该返回新的指针。但是,你没有动力地陈述,你不“想”返回任何东西。所以,我想你需要的参数指针的指针,这样你就可以从:在函数调用者的指针更改:

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

不要在你的情况下使用printfputs。如果您没有额外的参数将"a%sx%d"传递给您的printf,那么您的程序具有未定义的行为并会崩溃。

学习使用调试器,并打印相关字符串的地址。例如,你可能把在几个地方类似的声明,

fprintf(stderr, "at %s:%d cstr=%p\n", __FILE__, __LINE__, cstr); 
当然

由可能更合适的变量名称替换cstr两次。

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); 
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);你是一个指针传递给这里的指针。

相关问题