![](/img/trans.png)
[英]initialization of 'const char **' from incompatible pointer type 'char *'
[英]Assign a const to char pointer on initialization
我有一個無法更改的功能,例如:
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
嗎? 如果沒有,我該怎么辦?
函數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;
}
這三個選項將為函數f
提供可用的語義。 但是正如您所說的,您無法更改它,那么它就注定了。
什么?
如果該函數看起來像這樣,並且您無法更改它,那么您將無法做您想做的事情。
該函數無法在調用者的作用域內更改變量的值,這是不可能的,除非將參數設為char **var
。
如果您像f("");
這樣稱呼它f("");
它將使用某個靜態字符串的地址在某處進行調用,但是該地址將立即被malloc()
的調用所覆蓋。
同樣,該調用不應將其返回值轉換為C。
為了理解代碼的目的, 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);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.