不熟悉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返回任何内容。)
答案 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);
等等......
printf("%s",cmd)
。
答案 2 :(得分:1)
您应该返回新指针。但是你没有动力地说,你不“想”回报任何东西。所以,我猜你需要让参数成为指向指针的指针,这样你就可以在函数中改变调用者的指针:
void db_cstr(char **cstr, size_t len);
答案 3 :(得分:0)
在您的情况下,请勿使用printf
,puts
。如果您在没有附加参数的情况下将"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);
你在这里传递指针指针。