我有一个我无法改变的功能:
void f(char *var) {
var = (char*) malloc(size*sizeof(char)); // I dont know the size, its a example
// .. others operation with var
}
那么使用f
函数初始化变量的最佳方法是什么:
char *myvar = "";
f(myvar);
// others operation;
free(myvar);
我的问题是,将const
""
char
指定为myvar
指针为{{1}}是否正确?如果没有,我该怎么办?
答案 0 :(得分:1)
函数f()
注定失败。它对var
的影响不能超出其范围。
应该更改以便:
(i)它收到一个预先分配的缓冲区:
void f(char *var) {
// just uses var contents
}
(ii)它接收一个指向缓冲区的指针,它可以存储一个新的分配区域:
void f(char **var) {
*var = (char*) malloc(size*sizeof(char));
// .. others operation with var
}
或
(iii)它返回新分配的缓冲区(在这种情况下,参数是无用的):
char* f(char *var) {
var = (char*) malloc(size*sizeof(char)); // I dont know the size, its a example
// .. others operation with var
return var;
}
这3个选项将为函数f
提供可用的语义。但正如你所说,你无法改变它,那么它就注定了。
答案 1 :(得分:0)
什么?
如果该功能看起来像这样,并且您无法更改它,则无法执行您似乎想要执行的操作。
该函数不能更改调用者范围中变量的值,如果不将参数设为char **var
,则根本不可能。
如果您将其称为f("");
,则会在某处使用某个静态字符串的地址调用它,但该地址将立即被malloc()
的调用覆盖。
此外,该电话应该not have its return value cast, in C。
答案 2 :(得分:0)
尝试理解代码的目的,myvar = ""
初始化似乎毫无意义。
在函数f
中,您将局部变量var
设置为某个值。这对调用它时传递给该函数的变量的值没有影响。将其更改为以下任一选项:
void f(char** var,int size)
{
*var = malloc(size);
...
}
void SomeOtherFunc()
{
char* myvar;
...
f(&myvar,size);
...
free(myvar);
...
}
char* f(int size)
{
char* var = malloc(size);
...
return var;
}
void SomeOtherFunc()
{
char* myvar;
...
myvar = f(size);
...
free(myvar);
...
}