在初始化时将const指定给char指针

时间:2014-07-08 14:45:30

标签: c pointers char

我有一个我无法改变的功能:

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}}是否正确?如果没有,我该怎么办?

3 个答案:

答案 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);
    ...
}